This question is the same as "Max Chunks to Make Sorted" except the integers of the given array are not necessarily distinct, the input array could be up to length 2000, and the elements could be up to 10**8.


Given an array arr of integers (not necessarily distinct), we split the array into some number of "chunks" (partitions), and individually sort each chunk.  After concatenating them, the result equals the sorted array.

What is the most number of chunks we could have made?

Example 1:

Input: arr = [5,4,3,2,1]
Output: 1
Explanation:
Splitting into two or more chunks will not return the required result.
For example, splitting into [5, 4], [3, 2, 1] will result in [4, 5, 1, 2, 3], which isn't sorted.

Example 2:

Input: arr = [2,1,3,4,4]
Output: 4
Explanation:
We can split into two chunks, such as [2, 1], [3, 4, 4].
However, splitting into [2, 1], [3], [4], [4] is the highest number of chunks possible.

Note:

  • arr will have length in range [1, 2000].
  • arr[i] will be an integer in range [0, 10**8].

769. Max Chunks To Make Sorted的拓展,这一题可以有重复的数字。

解法:能形成块儿的数字之和跟排序后的数组的相同长度的子数组的数字之和是相同的。

Algorithm: Iterate through the array, each time all elements to the left are smaller (or equal) to all elements to the right, there is a new chunck.
Use two arrays to store the left max and right min to achieve O(n) time complexity. Space complexity is O(n) too.
This algorithm can be used to solve ver1 too.

Java:

class Solution {
public int maxChunksToSorted(int[] arr) {
int n = arr.length;
int[] maxOfLeft = new int[n];
int[] minOfRight = new int[n]; maxOfLeft[0] = arr[0];
for (int i = 1; i < n; i++) {
maxOfLeft[i] = Math.max(maxOfLeft[i-1], arr[i]);
} minOfRight[n - 1] = arr[n - 1];
for (int i = n - 2; i >= 0; i--) {
minOfRight[i] = Math.min(minOfRight[i + 1], arr[i]);
} int res = 0;
for (int i = 0; i < n - 1; i++) {
if (maxOfLeft[i] <= minOfRight[i + 1]) res++;
} return res + 1;
}
}  

Python:

def maxChunksToSorted(self, arr):
res, c1, c2 = 0, collections.Counter(), collections.Counter()
for a, b in zip(arr, sorted(arr)):
c1[a] += 1
c2[b] += 1
res += c1 == c2
return res

C++:

class Solution {
public:
int maxChunksToSorted(vector<int>& arr) {
int res = 0, sum1 = 0, sum2 = 0;
vector<int> expect = arr;
sort(expect.begin(), expect.end());
for (int i = 0; i < arr.size(); ++i) {
sum1 += arr[i];
sum2 += expect[i];
if (sum1 == sum2) ++res;
}
return res;
}
};

C++:

class Solution {
public:
int maxChunksToSorted(vector<int>& arr) {
int res = 1, n = arr.size();
vector<int> f = arr, b = arr;
for (int i = 1; i < n; ++i) f[i] = max(arr[i], f[i - 1]);
for (int i = n - 2; i >= 0; --i) b[i] = min(arr[i], b[i + 1]);
for (int i = 0; i < n - 1; ++i) {
if (f[i] <= b[i + 1]) ++res;
}
return res;
}
};

C++:

class Solution {
public:
int maxChunksToSorted(vector<int>& arr) {
int res = 1, n = arr.size(), curMax = INT_MIN;
vector<int> b = arr;
for (int i = n - 2; i >= 0; --i) b[i] = min(arr[i], b[i + 1]);
for (int i = 0; i < n - 1; ++i) {
curMax = max(curMax, arr[i]);
if (curMax <= b[i + 1]) ++res;
}
return res;
}
};

C++:

class Solution {
public:
int maxChunksToSorted(vector<int>& arr) {
stack<int> st;
for (int i = 0; i < arr.size(); ++i) {
if (st.empty() || st.top() <= arr[i]) {
st.push(arr[i]);
} else {
int curMax = st.top(); st.pop();
while (!st.empty() && st.top() > arr[i]) st.pop();
st.push(curMax);
}
}
return st.size();
}
};

  

类似题目:

[LeetCode] 769. Max Chunks To Make Sorted 可排序的最大块数  

  

All LeetCode Questions List 题目汇总

最新文章

  1. STL之priority_queue
  2. C#实现哥德巴赫猜想
  3. C# 热敏打印机 Socket 网络链接 打印 图片 (二)
  4. 清空文件下的SVN控制文件
  5. tomcat 5.5、6、7各版本的web-app标准
  6. jQuery实现等比例缩放大图片
  7. .NET Framework 4.6的新东西
  8. ios7 Cocos2dx 隐藏状态栏设置
  9. 如何使用 OneAPM 监控微软 Azure Cloud Service ?
  10. C# Path.Combine 方法的用法
  11. webstorm使用教程之 使用github
  12. Lucene4.9学习笔记——Lucene建立索引
  13. shu_1186 字符排列问题
  14. javascript中数组排序
  15. MySQL数据库需进行修改密码问题解决方案
  16. Getting Started with XlsxWriter
  17. 吴裕雄 32-MySQL 导入数据
  18. react组件父传子
  19. PostgreSQL入门,PostgreSQL和mysql
  20. 面试的角度诠释Java工程师(二)

热门文章

  1. vue项目中使用vue-layer弹框插件
  2. wordpress文章显示同一分类下的上一篇下一篇
  3. 如何保护你的 Python 代码 (一)—— 现有加密方案
  4. accept返回的socket的端口号和连接socket一样的!!! socket绑定信息结构
  5. mysql使用过程中出现的问题总结
  6. BigDecimal保留小数
  7. EasyExcel引入
  8. 第03组 Alpha冲刺(4/4)
  9. python实现余弦相似度文本比较
  10. Math小记