LeetCode -- 769. 最多能完成排序的块
题目性质:分块后每个块中的最大值单调递增,可以利用单调栈求解。
我们将每个块中的最大值放入单调栈中, 最终的结果为单调栈的大小。
c ++ class Solution { const static int N = 15; public: int maxChunksToSorted(vector<int>& arr) { int stk[N] = {0}, top = 0; int n = arr.size(); for(int i = 0; i < n; i ++ ) { if(!top || stk[top] <= arr[i]) { stk[ ++ top] = arr[i]; } else { int mx = stk[top -- ]; while(top && stk[top] > arr[i]) { top -- ; } stk[ ++ top] = mx; } } return top; } };
java class Solution { public int maxChunksToSorted(int[] arr) { int[] stk = new int[15]; int top = 0; for(int i = 0; i < arr.length; i ++ ) { if(top == 0 || stk[top] <= arr[i]) { stk[ ++ top] = arr[i]; } else { int mx = stk[top -- ]; while(top != 0 && stk[top] > arr[i]) { top -- ; } stk[ ++ top] = mx; } } return top; } }
python class Solution: def maxChunksToSorted(self, arr: List[int]) -> int: stk = [] for i in arr: if len(stk) == 0 or stk[-1] <= i: stk.append(i) else: mx = stk[-1] stk.pop() while len(stk) != 0 and stk[-1] > i: stk.pop() stk.append(mx) return len(stk)
golang func maxChunksToSorted(arr []int) int { var stk [15]int; top := 0 for _, v:= range arr { if top == 0 || stk[top] <= v { top ++ stk[top] = v } else { mx := stk[top] top -= 1 for top != 0 && stk[top] >= v { top -- } top ++ stk[top] = mx } } return top }
js /** * @param {number[]} arr * @return {number} */ var maxChunksToSorted = function(arr) { let stk = []; for(let i = 0; i < arr.length; i ++ ) { if(stk.length == 0 || stk[stk.length - 1] <= arr[i]) { stk.push(arr[i]); } else { let mx = stk[stk.length - 1]; stk.pop(); while(stk.length > 0 && stk[stk.length - 1] > arr[i]) { stk.pop(); } stk.push(mx); } } return stk.length; };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧