LeetCode_581_最短无序连续子数组
廖家龙 用心听,不照做

题目描述:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。请你找出符合题意的 最短 子数组,并输出它的长度。

示例:

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

输入:nums = [1,2,3,4]
输出:0

输入:nums = [1]
输出:0

提示:
1. 1 <= nums.length <= 10^4
2. -10^5 <= nums[i] <= 10^5

解法1:双指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {

vector<int> sorted_nums(nums);

//对数组的副本排序,得到升序数组
sort(sorted_nums.begin(), sorted_nums.end());

//双指针分别找到不同段落的边界
int l = -1, r = -1;
for (int i = 0; i < nums.size(); i++) {

if (nums[i] != sorted_nums[i]) {
l = i;
break;
}
}
for (int i = nums.size() - 1; i >= 0; i--) {

if (nums[i] != sorted_nums[i]) {
r = i;
break;
}
}

if (l == -1) return 0;

return r - l + 1;
}
};