LeetCode 581. 最短无序连续子数组
给你一个整数数组 nums
,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
请你找出符合题意的 最短 子数组,并输出它的长度。
示例 1:
输入:nums = [2,6,4,8,10,9,15]
输出:5
解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
method
B段中的元素肯定大于A段中的任意元素,且小于C段中的任意元素
可以从左到右维护一个max
,在A段和C段,每个元素都会大于前一个元素,所以max
会被不断更新,在B段中,会出现某个元素nums[i]<max
,则说明这个元素值可能是B段的右边界同理。可以从右到左维护一个min
,在A段和C段,每个元素都会小于后一个元素,所以min
会被不断更新,在B段中,会出现某个元素nums[i]>min
,则说明这个元素可能是B段的左边界
int findUnsortedSubarray(vector<int>& nums) {
int maxn = INT_MIN;
int minn = INT_MAX;
int left = -1, right = -1;
int n = nums.size();
for (int i = 0; i < n; i++) {
if (nums[i] < maxn) {
right = i;
} else {
maxn = nums[i];
}
if (nums[n - i - 1] > minn) {
left = n - i - 1;
} else {
minn = nums[n - i - 1];
}
}
return left == -1 ? 0 : right - left + 1;
}