其他分享
首页 > 其他分享> > 962. Maximum Width Ramp

962. Maximum Width Ramp

作者:互联网

本题题意:
在数组中,找到最大的j-i,使得i<j and A[i] <= A[j]

思路:
维持一个递减的栈,遇到比栈顶小的元素,进栈;
比大于等于栈顶的元素-> 找到栈中第一个小于等于该元素的下标
时间:O(Nlgn),空间:O(N)

List<Integer> s = new ArrayList<>();
        int res = 0;
        for (int i = 0; i < A.length; i++){
            if (s.isEmpty() || A[ s.get(s.size() - 1) ] > A[i]){
                s.add(i);
            }else{
                int left = 0, right = s.size() - 1;
                int mid = 0;
                while (left < right){
                    mid = (left + right) / 2;
                    if (A[s.get(mid)] > A[i]){
                        left = mid + 1;
                    }else{
                        right = mid;
                    }
                }
                res = Math.max(res, i - s.get(left));
            }
        }

进一步的栈利用:

    Stack<Integer> s = new Stack<>();
        int res = 0;
        for (int i = 0; i < A.length;i++){
            if (s.isEmpty() || A[s.peek()] > A[i]){
                s.add(i);
            }
        }
        for (int i = A.length - 1; i > res; i--){
            while (!s.isEmpty() && A[s.peek()] <= A[i]){
                res = Math.max(res, i - s.pop());
            }
        }
        return res;

标签:right,int,res,Ramp,mid,Maximum,Width,isEmpty,left
来源: https://www.cnblogs.com/whyaza/p/10867609.html