大理建设招标有限公司网站,公司网址例子,网站首页的动态视频怎么做的,做照片用的视频模板下载网站好给定一个数组 nums#xff0c;找出最短的连续子数组#xff0c;使得只要对这个子数组进行升序排序#xff0c;整个数组就变为升序有序。
示例#xff1a; 输入#xff1a;nums [2, 6, 4, 8, 10, 9, 15] 输出#xff1a;5#xff08;排序 [6, 4, 8, 10, 9] 后整个数组…给定一个数组 nums找出最短的连续子数组使得只要对这个子数组进行升序排序整个数组就变为升序有序。
示例 输入nums [2, 6, 4, 8, 10, 9, 15] 输出5排序 [6, 4, 8, 10, 9] 后整个数组有序 解法分析最优解O(n) 时间O(1) 空间
关键思路 从左到右找右边界遍历数组记录当前最大值 max如果 nums[i] max说明 i 应该在待排序子数组内更新右边界 right i。 从右到左找左边界反向遍历数组记录当前最小值 min如果 nums[i] min说明 i 应该在待排序子数组内更新左边界 left i。 计算子数组长度right - left 1如果 right left否则数组已经有序返回 0。
代码实现Python
python
复制
下载
def findUnsortedSubarray(nums):n len(nums)if n 1:return 0# 初始化左右边界left, right n, -1# 从左到右找右边界max_so_far nums[0]for i in range(1, n):if nums[i] max_so_far:right ielse:max_so_far nums[i]# 从右到左找左边界min_so_far nums[-1]for i in range(n-2, -1, -1):if nums[i] min_so_far:left ielse:min_so_far nums[i]return right - left 1 if right left else 0
复杂度分析 时间复杂度O(n)两次遍历数组 空间复杂度O(1)仅用几个变量 为什么这个方法有效 右边界 right 遍历时如果 nums[i] 比当前最大值 max_so_far 小说明 nums[i] 应该被排序更新 right i。 例如 [2, 6, 4, 8, 10, 9, 15]max_so_far 依次是 2, 6, 6, 8, 10, 10nums[5]9 10所以 right5。 左边界 left 反向遍历时如果 nums[i] 比当前最小值 min_so_far 大说明 nums[i] 应该被排序更新 left i。 例如 min_so_far 依次是 15, 9, 9, 8, 4, 4nums[1]6 4所以 left1。 最终结果right - left 1 5 - 1 1 5即排序 [6, 4, 8, 10, 9] 后整个数组有序。 测试用例验证
输入输出解释[2, 6, 4, 8, 10, 9, 15]5排序 [6,4,8,10,9] 后整个数组有序[1, 2, 3, 4]0已经有序[1]0单元素数组[5, 4, 3, 2, 1]5整个数组需要排序 总结 最优解两次遍历分别确定左右边界时间复杂度 O(n)空间 O(1)。 适用场景需要高效找到最短无序子数组的情况如数据流分析、异常检测。 变种问题如果要求返回子数组本身而非长度只需记录 left 和 right 并切片即可。