原题链接:581. 最短无序连续子数组
Solution:
对数组进行排序再和原数组进行比较,当出现无序情况时保留对应坐标
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
if(nums.empty() || nums.size() == 1) return 0;
int n = nums.size();
vector<int> num_sort(nums);
sort(num_sort.begin(),num_sort.end());
int l = 0,r = n - 1;
while(l < n && num_sort[l] == nums[l]) l++;
while(r >= 0 && num_sort[r] == nums[r]) r--;
return (r - l + 1) == -n ? 0 : r - l + 1;
}
};
线性扫描:
遍历过程中 :
找到 从左到右 最后一个 破坏递增性质的数的下标 —— right
找到 从右到左 最后一个 破坏递减性质的数的小标 —— left
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
int n = nums.size();
int maxn = INT_MIN, right = -1;
int minn = INT_MAX, left = -1;
for (int i = 0; i < n; i++) {
if (maxn > nums[i]) {
right = i;
} else {
maxn = nums[i];
}
if (minn < nums[n - i - 1]) {
left = n - i - 1;
} else {
minn = nums[n - i - 1];
}
}
return right == -1 ? 0 : right - left + 1;
}
};