📌  相关文章
📜  要删除的最小子数组的长度,以便对其余数组进行排序(1)

📅  最后修改于: 2023-12-03 15:41:33.381000             🧑  作者: Mango

题目

给定一个整数数组,你需要找到要排序的最短子数组的长度,以便将其余部分按升序排列并使整个数组变为升序排序。

思路

首先,我们需要确定需要排序的最小子数组的边界。为了让剩下的数组变为升序排列,我们需要保证这个子数组中元素的大小是单调递增或单调递减的。

所以,我们可以从左往右遍历整个数组,一旦遇到一个元素小于前面一个元素时,就说明要开始记录需要排序的最小子数组的左边界。

然后,我们可以从右往左遍历整个数组,一旦遇到一个元素大于后面一个元素时,就说明要开始记录需要排序的最小子数组的右边界。

最后,我们可以得到需要排序的最小子数组的左右边界,根据这两个边界就可以计算出子数组的长度。

代码实现
def findUnsortedSubarray(nums: List[int]) -> int:
    if not nums:
        return 0

    # 初始化左右边界
    left, right = len(nums), -1

    # 记录当前最大值和最小值
    max_num, min_num = nums[0], nums[-1]

    # 从左往右遍历
    for i in range(len(nums)):
        if nums[i] < max_num:
            left = min(left, i)
        else:
            max_num = nums[i]

    # 从右往左遍历
    for i in range(len(nums)-1, -1, -1):
        if nums[i] > min_num:
            right = max(right, i)
        else:
            min_num = nums[i]

    # 计算子数组的长度
    return right - left + 1 if right > left else 0
时间复杂度

该算法需要遍历两次整个数组,所以时间复杂度为O(n)。

空间复杂度

该算法只需要使用常数级别的空间,所以空间复杂度为O(1)。