📅  最后修改于: 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)。