(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, 10,000]。
- 输入的数组可能包含重复元素 ,所以升序的意思是<=。
思路:
举例来说吧 如果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 有七个数) };