classSolution(object):defmaxChunksToSorted(self,arr): count_a = collections.defaultdict(int) count_b = collections.defaultdict(int) ans =0for a, b inzip(arr, sorted(arr)): count_a[a]+=1 count_b[b]+=1if count_a == count_b: ans +=1return ans
复杂度分析
时间复杂度:内部 count_a 和 count_b 的比较时间复杂度也是 $O(N)$,因此总的时间复杂度为 $O(N^2)$,其中 N 为数组长度。
空间复杂度:使用了两个 counter,其大小都是 N,因此空间复杂度为 $O(N)$,其中 N 为数组长度。
classSolution:defmaxChunksToSorted(self,A: [int]) ->int: stack = []for a in A:# 遇到一个比栈顶小的元素,而前面的块不应该有比 a 小的# 而栈中每一个元素都是一个块,并且栈的存的是块的最大值,因此栈中比 a 小的值都需要 pop 出来if stack and stack[-1]> a:# 我们需要将融合后的区块的最大值重新放回栈# 而 stack 是递增的,因此 stack[-1] 是最大的 cur = stack[-1]# 维持栈的单调递增while stack and stack[-1]> a: stack.pop() stack.append(cur)else: stack.append(a)# 栈存的是块信息,因此栈的大小就是块的数量returnlen(stack)
CPP Code:
classSolution {public:intmaxChunksToSorted(vector<int>& arr) { stack<int> stack;for(int i =0;i<arr.size();i++){ // 遇到一个比栈顶小的元素,而前面的块不应该有比 a 小的 // 而栈中每一个元素都是一个块,并且栈的存的是块的最大值,因此栈中比 a 小的值都需要 pop 出来if(!stack.empty()&&stack.top()>arr[i]){ // 我们需要将融合后的区块的最大值重新放回栈 // 而 stack 是递增的,因此 stack[-1] 是最大的int cur =stack.top(); // 维持栈的单调递增while(!stack.empty()&&stack.top()>arr[i]){sstackta.pop(); }stack.push(cur); }else{stack.push(arr[i]); } } // 栈存的是块信息,因此栈的大小就是块的数量returnstack.size(); }};
JAVA Code:
classSolution {publicintmaxChunksToSorted(int[] arr) {LinkedList<Integer> stack =newLinkedList<Integer>();for (int num : arr) {// 遇到一个比栈顶小的元素,而前面的块不应该有比 a 小的// 而栈中每一个元素都是一个块,并且栈的存的是块的最大值,因此栈中比 a 小的值都需要 pop 出来if (!stack.isEmpty() && num <stack.getLast()) {// 我们需要将融合后的区块的最大值重新放回栈// 而 stack 是递增的,因此 stack[-1] 是最大的int cur =stack.removeLast();// 维持栈的单调递增while (!stack.isEmpty() && num <stack.getLast()) {stack.removeLast(); }stack.addLast(cur); } else {stack.addLast(num); } }// 栈存的是块信息,因此栈的大小就是块的数量returnstack.size(); }}
JS Code:
varmaxChunksToSorted=function (arr) {conststack= [];for (let i =0; i <arr.length; i++) { a = arr[i];if (stack.length>0&& stack[stack.length-1] > a) {constcur= stack[stack.length-1];while (stack && stack[stack.length-1] > a) stack.pop();stack.push(cur); } else {stack.push(a); } }returnstack.length;};
Go Code:
funcmaxChunksToSorted(arr []int) int {var stack []int// 单调递增栈, stack[-1] 栈顶for _, a :=range arr {// 遇到一个比栈顶小的元素,而前面的块不应该有比 a 小的// 而栈中每一个元素都是一个块,并且栈的存的是块的最大值,因此栈中比 a 小的值都需要 pop 出来iflen(stack) >0&& stack[len(stack)-1] > a {// 我们需要将融合后的区块的最大值重新放回栈// 而 stack 是递增的,因此 stack[-1] 是最大的 cur := stack[len(stack)-1]// 维持栈的单调递增forlen(stack) >0&& stack[len(stack)-1] > a { stack = stack[:len(stack)-1] // pop } stack =append(stack, cur) // push } else { stack =append(stack, a) // push } }// 栈存的是块信息,因此栈的大小就是块的数量returnlen(stack)}