题目描述
给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
你找到的子数组应是最短的,请输出它的长度。
示例 1:
输入: [2, 6, 4, 8, 10, 9, 15]
输出: 5
解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
思路分析&代码实现
思路:
首先,找到前半截和后半截排好序的最长数组,因为除去这部分的中间部分数组长度一定是要求的长度的下界。
(考虑,前后半截排好序也不一定就可以,还需要满足的条件:1.前半截排好序的数比中间部分的最小的数要小;2.后半截排好序的数一定要比中间部分最大的数都大。)
因此,接下来,我们求中间的最小数和最大数。
最后,从最靠近中间部分的数开始比较,若是前半部分的比最小数大,则中间部分需要加1,继续向前遍历。后半部分也是一样的。
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
int l = 0, r = nums.size()-1;
if( !r ) return 0;
while(l < r && nums[l] <= nums[r]){
if(nums[l] > nums[l+1] && nums[r] < nums[r-1])
break;
if(nums[l] <= nums[l+1]) l++;
if(nums[r] >= nums[r-1]) r--;
}
if(l >= r) return 0;
int l1 = l;
int min = nums[l], max = nums[l];
while(l1 <= r)
{
if(nums[l1] < min) min = nums[l1];
if(nums[l1] > max) max = nums[l1];
l1++;
}
while( l > 0 && nums[l-1] > min) l--;
while( r < nums.size()-1 && nums[r+1] < max) r++;
return r-l+1;
}
};