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;
}
};