玩命加载中 . . .

581-最短无序连续子数组


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

文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录