给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
你找到的子数组应是最短的,请输出它的长度。
示例 1:
输入: [2, 6, 4, 8, 10, 9, 15]
输出: 5
解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
说明 :
- 输入的数组长度范围在 [1, 10,000]。
- 输入的数组可能包含重复元素 ,所以升序的意思是<=。
分析:
- 我们需要找一段
最短无序数组nums[start:end]
,使其排序完成后整个数组也是有序的,换个角度想,我们也可以找两段最长的有序数组nums[:start]和nums[end:]
,那么怎样找到“最长”的情况呢 - 对于某一个元素nums[i],如果其满足
nums[i] < min(nums[i+1:])
,则我们可以说nums[i]是处于有序序列中的,即nums[:start]中。 - 对于某一个元素nums[j],如果其满足
nums[j] > max(nums[:j])
,则我们可以说nums[j]也是处于有序序列中的,即nums[end:]中。
思路:
- 从0开始,找到第一个不满足
nums[i] < min(nums[i+1:])
的i,记为start - 从len(nums)-1开始,找到第一个不满足
nums[j] > max(nums[:j])
的j,记为end - 用s[i]记录min(nums[i:]),用l[j]记录max(nums[:j])
- 处理数组初始有序情况
1 | class Solution(object): |