最短无序连续子数组

题目链接

最短无序连续子数组

题目描述

最短无序连续子数组_第1张图片

注意点

  • 找出符合题意的 最短 子数组,并输出它的长度
  • -100000 <= nums[i] <= 100000

解答思路

  • 本题的数组可以分为三段,左段中段和右段,如下图所示

最短无序连续子数组_第2张图片

  • 观察规律可知,左段元素始终比中段小,右段元素始终比中段大,区别是中段中的元素不是严格递增的,所以关键是要找到中段的左右边界
  • 将中段的左右边界分别定义为begin和end,进行两次遍历
    • 从左到右维护一个最大值max,在进入右段之前,那么遍历到的nums[i]都是小于max的,end也就是遍历中最后一个小于max元素的位置(进入右端后新的元素始终都比之前维护的max大)
    • 从右到左维护一个最小值min,在进入左段之前,那么遍历到的nums[i]也都是大于min的,begin也就是最后一个大于min元素的位置(进入左端后新的元素始终都比之前维护的min小)

代码

class Solution {
    public int findUnsortedSubarray(int[] nums) {
        int n = nums.length;
        int maxValue = Integer.MIN_VALUE;
        int minValue = Integer.MAX_VALUE;
        int begin = 0;
        int end = -1;
        for (int i = 0; i < n; i++) {
            if (nums[i] < maxValue) {
                end = i;
            } else {
                maxValue = nums[i];
            }
        }
        for (int i = n - 1; i >= 0; i--) {
            if (nums[i] > minValue) {
                begin = i;
            } else {
                minValue = nums[i];
            }        
        }
        return end - begin + 1;
    }
}

关键点

  • 双指针的思想
  • 怎么找到中段的左右边界

你可能感兴趣的:(算法TOP100,算法,leetcode,java,数据结构,双指针)