Leetcode刷题笔记-最短无序连续子数组
题目链接:https://leetcode.cn/problems/shortest-unsorted-continuous-subarray/description/
题目描述:
给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
请你找出符合题意的 最短 子数组,并输出它的长度。
示例 1:
输入:nums = [2,6,4,8,10,9,15] 输出:5 解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
示例 2:
输入:nums = [1,2,3,4] 输出:0
示例 3:
输入:nums = [1] 输出:0
核心思想:
1. 一定是原数组的左右边界往内收缩的子数组
2. 这个子数组的右端点一定比子数组中的最大值要小,左端点一定比子数组的最小值要大
代码:
class Solution:def findUnsortedSubarray(self, nums: List[int]) -> int:# 一定是原数组的左右边界往内收缩的子数组# 这个子数组的右端点一定比子数组中的最大值要小,左端点一定比子数组的最小值要大n = len(nums)if n <= 1:return 0start, end = -1, -2 # 这样设置的原因是使得原数组如果是升序数组时,start和end不会更新,应该返回结果0max_val, min_val = nums[0], nums[-1]# 从左往右找出右边界for i in range(1, n):max_val = max(max_val, nums[i])if nums[i] < max_val:end = i# 从右往左找出左边界for i in range(n-2, -1, -1):min_val = min(min_val, nums[i])if nums[i] > min_val:start = ireturn end- start + 1
