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;
};
复制代码

 

posted @   深渊之巅  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示