- 排序 + 前缀和方法代码实现如下:【贴自评论区】
int maxChunksToSorted(vector<int>& arr) {
vector<int> res = arr;
sort(res.begin(), res.end());
int num = 0;
long sum1 = 0, sum2 = 0;
for (int i = 0; i < arr.size(); i++)
{
sum1 += res[i];
sum2 += arr[i];
if (sum1 == sum2) num++;
}
return num;
}
- 排序 + 哈希表计数方法代码实现如下:
class Solution
{
public:
int maxChunksToSorted(vector<int>& arr)
{
vector<int> sorted = arr;
sort(sorted.begin(), sorted.end());
int ans = 0;
unordered_map<int, int> cnt;
for(int i = 0; i < arr.size(); ++i)
{
++cnt[sorted[i]];
--cnt[arr[i]];
if(cnt[sorted[i]] == 0)
cnt.erase(sorted[i]);
if(cnt[arr[i]] == 0)
cnt.erase(arr[i]);
if(cnt.empty())
++ans;
}
return ans;
}
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 单调栈方法代码实现如下:【贴自官方题解】
class Solution {
public:
int maxChunksToSorted(vector<int>& arr) {
stack<int> st;
for (auto &num : arr) {
if (st.empty() || num >= st.top()) {
st.emplace(num);
} else {
int mx = st.top();
st.pop();
while (!st.empty() && st.top() > num) {
st.pop();
}
st.emplace(mx);
}
}
return st.size();
}
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 前缀 + 后缀方法代码实现如下:
class Solution
{
public:
int maxChunksToSorted(vector<int>& arr)
{
int m = arr.size();
vector<int> prefix_max(m);
vector<int> suffix_min(m);
prefix_max[0] = arr[0];
for(int i = 1; i < m; ++i)
prefix_max[i] = max(prefix_max[i-1], arr[i]);
suffix_min[m-1] = arr[m-1];
for(int i = m-2; i >= 0; --i)
suffix_min[i] = min(suffix_min[i+1], arr[i]);
int ans = 1;
for(int i = 0; i < m-1; ++i)
{
if(prefix_max[i] <= suffix_min[i+1])
++ans;
}
return ans;
}
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24