力扣刷题Python笔记:最短无序连续子数组

题目

给你一个整数数组 nums ,你需要找出一个连续子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

请你找出符合题意的最短子数组,并输出它的长度。
力扣刷题Python笔记:最短无序连续子数组_第1张图片
来源:力扣(LeetCode)

Python解法

排序解法

这道题我的解题思路如下:

  • 先判断给定数组 nums 的长度,如果长度不大于1,那么直接返回0;
  • 创建一个结果数组 res 用来存放满足题目要求子数组的起始索引和结尾索引;
  • 我们对给定数组 nums 进行排序得到一个新数组 sort_nums,然后分别正序和逆序将 sort_nums 和 nums 进行逐元素比较,并将第一个元素不同的位置索引存入 res 数组中;
  • 如果 res 为空返回0,否则返回 res 数组中元素值得差+1。

代码如下:

def findUnsortedSubarray(self, nums: List[int]) -> int:
    n = len(nums)
    if n <= 1:
        return 0
    res = []
    sort_nums = sorted(nums)
    for i in range(n):
        if nums[i] != sort_nums[i]:
            res.append(i)
            break
    for i in range(n-1, -1, -1):
        if nums[i] != sort_nums[i]:
            res.append(i)
            break
    return 0 if not res else res[1]-res[0]+1

    # 以下为题解中的代码简化写法
    sort_nums = sorted(nums)
    left = 0
    right = len(nums) - 1
    while left <= right and nums[left] == sort_nums[left]:
        left += 1
    while left <= right and nums[right] == sort_nums[right]:
        right -= 1
    return right - left + 1

你可能感兴趣的:(力扣python刷题,算法)