题解之一:
class Solution {
public int findUnsortedSubarray(int[] nums) {
//初始化
int len = nums.length;
int min = nums[len-1];
int max = nums[0];
int begin = 0, end = -1;
//遍历
for(int i = 0; i < len; i++){
if(nums[i] < max){ //从左到右维持最大值,寻找右边界end
end = i;
}else{
max = nums[i];
}
if(nums[len-i-1] > min){ //从右到左维持最小值,寻找左边界begin
begin = len-i-1;
}else{
min = nums[len-i-1];
}
}
return end-begin+1;
}
}
Python解法:
class Solution:
def findUnsortedSubarray(self, nums: List[int]) -> int:
n, _min, _max, l, r = len(nums), nums[-1], nums[0], 0, -1
for i in range(n):
if nums[i] < _max:
r = i
else:
_max = nums[i]
if nums[n - 1 - i] > _min:
l = n - 1 - i
else:
_min = nums[n - 1 - i]
return r - l + 1
参考:
0,10
1,9
2,8
3,7
4,6
5,5
6,4
7,3
8,2
9,1
10,0
这题的关键在于,单调递增是右边界,而不是左边界。如果搞反了答案就不对。