leetcode_581 最短无序连续子数组

90 阅读1分钟

要求

给你一个整数数组 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 <= nums.length <= 104
  • -105 <= nums[i] <= 105  

进阶:你可以设计一个时间复杂度为 O(n) 的解决方案吗?

核心代码

class Solution:
    def findUnsortedSubarray(self, nums: List[int]) -> int:
        nums_1 = []
        for num in nums:
            nums_1.append(num)
        nums_1.sort()
        i = 0
        j = len(nums) - 1
        while (nums_1[i] == nums[i]) and (i < len(nums) - 1):
            i += 1
        while (nums_1[j] == nums[j]) and (j > 1):
            j -= 1
        if i < j:
            return j - i + 1
        else:
            return 0

image.png

解题思路:将数组排序得到新数组,两个数组从前往后比较,第一个不同的位置就是最短无序连续子数组的起始点,从后往前比较,第一个不同的位置就是最短无序连续子数组的终止点。