从左往右,找前i个元素的最大值,当之后的元素小于最大值时,该元素就是前i个元素的所求数组的右边界。当i增长到n-1时,也得到了问题所求的子数组的右边界。左边界也同理。
int findUnsortedSubarray(vector<int>& nums) {
if(nums.empty()) return 0;
int n = nums.size();
//end=-2是为了当nums为正序时,输出0
int start = -1, end = -2;
int maxVal = nums[0], minVal = nums[n-1];
for(int i = 0; i < n; ++i){
int j = n-1 - i;
maxVal = max(maxVal,nums[i]);
minVal = min(minVal,nums[j]);
if(nums[i]<maxVal)
end = i;
if(nums[j]>minVal)
start = j;
}
return end-start+1;
}
还有一种更方便理解的方法,就是将nums复制并排列,分别从前后对比两个数组的元素,第一个不同的元素即为所求数组边界。