1. 题目描述
给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
请你找出符合题意的 最短 子数组,并输出它的长度。
示例 1:
输入:nums = [2,6,4,8,10,9,15]
输出:5
解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
示例 2:
输入:nums = [1,2,3,4]
输出:0
示例 3:
输入:nums = [1]
输出:0
提示:
1 <= nums.length <= 104
-105 <= nums[i] <= 105
2. 题解
- 用两个标识left right分别指向数组的左右两端
- 从left视角来看,往右的数都要比left左边的最大值要大,如果出现了比最大值小的数就是有问题的,记录下标
- 同样的,从right视角来看,往左的数都要比right右边的最小值要小,如果出现了比最小值大的数就是有问题的,记录下标
- 最终返回有问题的数的下标之差,就是结果
3. 代码
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
int len = nums.size();
int left = 0;
int right = len - 1;
int max_num = nums[0];
int min_num = nums[len - 1];
for(int i = 0; i < len; ++i)
{
max_num = max(nums[i], max_num); //最大值不断的更新
//从left视角来看,往右的数都要比left左边的最大值要大
//如果出现了比最大值小的数就是有问题的,记录下标
if(nums[i] < max_num)
{
left = i;
}
min_num = min(nums[len - i - 1], min_num);
//从right视角来看,往左的数都要比right右边的最小值要小
//如果出现了比最小值大的数就是有问题的,记录下标
if(nums[len - i - 1] > min_num)
{
right = len - i - 1;
}
}
return left > right ? left - right + 1 : 0;
}
};