贪心:
1. 确定可能需要排序的子数组,该子数组左侧为递增序列,右侧也为递增序列
2. 从子数组中取出最大最小值
3. 调整子数组边界,子数组左侧比子数组中最小值大的值都需要参与排序,子数组右侧比子数组中最大值小的值都需要参与排序
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
if(nums.empty()){
return 0;
}
int left = 0;
int right = nums.size()-1;
int max = INT_MIN;
int min = INT_MAX;
// 确定可能需要排序的子数组
while(left<=right-1){
if(nums[left]<=nums[left+1]){
left++;
}else{
break;
}
}
while(right>left){
if(nums[right]>=nums[right-1]){
right--;
}else{
break;
}
}
// 从子数组中取出最大最小值
for(int i = left;i<=right;i++){
if(nums[i]>max){
max = nums[i];
}
if(nums[i]<min){
min = nums[i];
}
}
// 子数组左侧比子数组中最小值大的值都需要参与排序
for(int i=0;i<left;i++){
if(nums[i]>min){
left = i;
break;
}
}
// 子数组右侧比子数组中最大值小的值都需要参与排序
for(int i=right;i<nums.size();i++){
if(nums[i]<max){
right = i;
}
}
if(left == right) return 0;
return right-left+1;
}
};