leetcode 581. Shortest Unsorted Continuous Subarray

This problem has very detailed solution. So just check out the solution page.

Method 1:

Use monotone stack to record the leftmost and rightmost index.

class Solution {
    public int findUnsortedSubarray(int[] nums) {
        int N = nums.length;
        Stack<Integer> s = new Stack<Integer>();
        int l = N, r = 0;
        s.add(0);
        for (int i = 1; i < N; ++i) {
            while (!s.isEmpty() && nums[s.peek()] > nums[i]) {
                l = Math.min(l, s.pop());
            }
            s.push(i);
            
        }
        s.clear();
        s.add(N - 1);
        for (int i = N - 1; i >= 0; --i) {
            while (!s.isEmpty() && nums[s.peek()] < nums[i]) {
                r = Math.max(r, s.pop());
            }
            s.push(i);
        }
        return r >= l ? r - l + 1: 0;
    }
}

Method 2:

Sort A and compare with original array

class Solution {
    public int findUnsortedSubarray(int[] nums) {
        int N = nums.length;
        int[] n = Arrays.copyOf(nums, N);
        Arrays.sort(n);
        int l = 0, r = N - 1;
        for (;l < N && n[l] == nums[l]; ++l);
        if (l == N) return 0;
        for (;r >= 0 && n[r] == nums[r]; --r);
        return r - l + 1;
    }
}
posted on 2019-03-29 21:26  王 帅  阅读(83)  评论(0编辑  收藏  举报