581. 最短无序连续子数组
Title Description
Given an integer array nums, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order.
Return the shortest such subarray and output its length.
Example 1:
Input: nums = [2,6,4,8,10,9,15]
Output: 5
Explanation: You need to sort [6, 4, 8, 10, 9] in ascending order to make the whole array sorted in ascending order.
Example 2:
Input: nums = [1,2,3,4]
Output: 0
Example 3:
Input: nums = [1]
Output: 0
Constraints:
1 <= nums.length <= 104 -105 <= nums[i] <= 105
Follow up: Can you solve it in O(n) time complexity?
题目描述
给你一个整数数组 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
提示:
1 <= nums.length <= 104 -105 <= nums[i] <= 105
进阶:你可以设计一个时间复杂度为 O(n) 的解决方案吗?
解题思路
- 复制一个新的数组
- 对复制的数组进行升序排序
- 从最左往右开始循环,两数组当前位置元素相同,计数变量加一,两数组当前位置元素不相同,从最右往左进行循环
- 两数组当前位置元素相同,计数变量加一,出现不同直接return
代码
/**
* @param {number[]} nums
* @return {number}
*/
var findUnsortedSubarray = function (nums) {
// 复制一个新的数组
var num2 = [];
for (var i = 0; i < nums.length; i++) { num2[i] = nums[i]; }
// 对复制的数组进行升序排序
num2.sort((a, b) => {
return a - b;
});
// 创建计数变量
var sum = 0;
// 从最左往右开始循环
for (var i = 0; i < nums.length;) {
// 两数组当前位置元素相同,计数变量加一
if (num2[i] == nums[i]) {
i++
sum += 1;
} else if (num2[i] != nums[i]) {
// 两数组当前位置元素不相同,从最右往左进行循环
for (let j = nums.length - 1; j >= 0;) {
// 两数组当前位置元素相同,计数变量加一
if (num2[j] == nums[j]) {
j--
sum += 1;
} else {
// 出现不同直接return
return nums.length - sum
}
}
}
}
// 如果可以进行到这里说明两个数组相同,return 0
return 0
};