(day4)581.最短无序连续子数组

说是简单题, 可把我难为的....

借鉴这位大佬的答案 https://www.cnblogs.com/jimmycheng/p/7673733.html

给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

你找到的子数组应是最短的,请输出它的长度。

示例 1:

输入: [2, 6, 4, 8, 10, 9, 15]
输出: 5
解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。

说明 :

  1. 输入的数组长度范围在 [1, 10,000]。
  2. 输入的数组可能包含重复元素 ,所以升序的意思是<=。

思路: 

举例来说吧 如果nums  = [1, 3, 2, 5, 6, 8, 4, 9]

1.从左向右, 找到 3 > 2 , 但是要向后找到 4 > 3, 把 4 作为end

2.从右向左,找到 8 > 4, 但还要向前找到 3 < 4, 把 3 作为beg

3. 答案就是 6 - 1 + 1 就是6

js:

var findUnsortedSubarray = function (nums) {
        var len = nums.length,
            beg = -1,
            min = nums[len - 1], // 最小值保存最后一位
            max = nums[0], // 最大值保存第一位
            end = -2;
      for (let i = 0; i < len; i ++) {
        max = Math.max(max, nums[i]); // 从前往后, 如果碰到比最大值大的, 重新赋值
        min = Math.min(min, nums[len - 1 - i]); //从后往前 如果碰到比最小值小的, 重新赋值
        if (nums[i] < max) {
          end = i; // 向后找比max小的数, 作为end
        }
        if (nums[len - 1 - i] > min) {
          beg = len - 1 - i; // 向前找比min大的数, 作为beg
        }
      }
      return end - beg + 1; // 最后返回结果, 如果数组刚好是从小到大的, -2 - (-1) + 1 = 0    (+1原因是长度, 比如 9 -> 3 有七个数)
    };
原文地址:https://www.cnblogs.com/jedenzhan/p/9477834.html