581. 最短无序连续子数组

给你一个整数数组 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

代码如下

int findUnsortedSubarray(int* nums, int numsSize) {
    //子序列当中的最大值或者最小值
    //最小值一定在左边,最大值一定在右边,最小值/最大值都不在端点说明没救了,没法再压缩,必须整体升序
    int low =0,high = numsSize -1;
    int min,max;
    int MinLen = numsSize;
    while(low < high){
        min = low,max = high;
        for(int i = low;i<= high;i++){
            if(nums[i] > nums[max]) max = i;
            if(nums[i] < nums[min]) min = i;
        }
        if(min!=low && max != high) break;
        if(min == low) low++;
        if(max == high) high--;
    }
    if(low == high) return 0;
    return high - low + 1;
}

思路:遍历数组,如果这一段数组最小值在最左边或者最大值在右边可以说明可以进一步压缩区间,如果最后low = high 说明原数组有序,返回0,否则返回high-low + 1,也就是说最后最短子数组最大值和最小值都不在端点,无法再缩减长度。

你可能感兴趣的:(算法)