给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
请你找出符合题意的 最短 子数组,并输出它的长度。
示例 1:
输入:nums = [2,6,4,8,10,9,15]
输出:5
解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shortest-unsorted-continuous-subarray
分析
两端是最小,或者最大的数字,主要是找到边界
解法1 排序,比较排序前后数组 - 通过
找两端出现的第一个不相同的值的位置即可
def solve1(nums):
# nums = [2,6,4,8,10,9,15] # 5
# nums = [1,2,3,4]
na = nums[:]
na.sort()
l = -1
r = -1
n = len(nums)
for i in range(n):
if l==-1 and nums[i]!=na[i]:l=i
if r==-1 and nums[n-i-1]!=na[n-i-1]:r=n-i-1
ans = 0 if r==-1 and l ==-1 else r-l+1
print(ans)
return ans
解法2- 双指针 - 通过
- 从前往后找最大的值,记录较小 (离最大值最近,且小于最大值)的值的 下标
- 从后往前找最小的值,记录较大(离最小值最近,且大于最小值))的值的 下标
def solve2(nums):
# nums = [2,6,4,8,10,9,15]
l = -1
r = -1
lmin = float('-inf')
rmax = float('inf')
n = len(nums)
for i in range(n):
if nums[i]>=lmin:lmin = nums[i]
else:l=i
if nums[n-i-1]<=rmax:rmax = nums[n-i-1]
else:r=n-i-1
ans = 0 if r==-1 and l ==-1 else l-r+1
print(ans)
return ans