题目
题目描述:
给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,
那么整个数组都会变为升序排序。你找到的子数组应是最短的,请输出它的长度。
直接看代码胜过千言万语
int findUnsortedSubarray(vector<int>& nums) {
//此解法参考英文官方LeetCode上的讨论
//从左到右扫描(或从右到左)找局部极大值(或局部极小值),若位置放置不正确,找到其应该存在的地方
int n = nums.size();
//赋初始开始和结束值
int start = -1;
int end = -2;
//结束值赋为-2是考虑在数组本身就是有序时,return也可以给出正确值
int min_ = nums[n - 1];
int max_ = nums[0];
for(int i = 0, pos = 0; i < n; i++) {
pos = n - 1 - i;
//找出局部极大、极小值
max_ = max(max_, nums[i]);
min_ = min(min_, nums[pos]);
//如果当前值小于局部极大值,用end记录该位置,找到该max的合适位置,
if(nums[i] < max_)
end = i;
//如果当前值大于局部极小值,用star记录该位置,找到该star的合适位置
if(nums[pos] > min_)
start = pos;
}
//返回开始和结束的索引差
return end - start + 1;
}
改成python版本的
def findUnsortedSubarray(self, nums: List[int]) -> int:
if not nums:
return 0
n = len(nums)
pos = n - 1
# 正序遍历,根据局部最大值,更新最右端索引
local_max = nums[0]
local_min = nums[pos]
start = -1
end = -2
for i in range(n):
pos = n-i-1 # 别忘了-1
local_max = max(local_max,nums[i])
local_min = min(local_min,nums[pos])
# 不满足升序了,升着升着突然降了
if nums[i] < local_max:
end = i
# 不满足降序了,降着降着突然升了
if nums[pos] > local_min:
start = pos
return end - start + 1 # 比如5到1的长度是5-1+1=5