LeetCode 581 Shortest Unsorted Continuous Subarray

559 阅读1分钟

LeetCode 581 Shortest Unsorted Continuous Subarray

思路

分别找到需要重排的子数组的左边界和右边界。

右边界:从左往右遍历,更新已经遍历过的子数组的maximum,如果当前元素小于maximum,则更新右边界。

左边界:从右往左遍历,更新已经遍历过的子数组的minimum,如果当前元素大于minimum,则更新左边界。

找到左边界和右边界后,比较这两个边界,如果右边界小于等于左边界,说明数组是有序的,不用重排。

代码

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        if (nums.empty() || nums.size() == 1) return 0;
        
        int left = 0, max = nums[0];
        for (int i = 1; i < nums.size(); ++i) {
            if (nums[i] < max)
                left = i;
            else max = nums[i];
        }
        
        int right = nums.size() - 1, min = nums[right];
        for (int i = nums.size() - 2; i >= 0; --i) {
            if (nums[i] > min)
                right = i;
            else min = nums[i];
        }
        
        if (right >= left)
            return 0;
        return left - right + 1;
        
    }
};