题目描述:给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
你找到的子数组应是最短的,请输出它的长度。
解题思路:对数组进行排序,然后第一个不一样的和最后一个不一样的区间就是要找的最短子数组,代码如下:
class Solution:
def findUnsortedSubarray(self, nums: List[int]) -> int:
size = len(nums)
if size == 1:return 0
sort_nums = sorted(nums)
start, end = size-1, 0
for i in range(size):
if nums[i] != sort_nums[i]:
start = min(start, i)
end = max(end, i)
return max(0, end-start+1)
解题思路二:遍历一遍数组将出现降序情况中的数对中的最大值和最小值找到,然后再遍历数组找到第一个比最小值大的地方和最右边第一个比最大值小的地方,整个区间就是要找的最小连续子数组
class Solution:
def findUnsortedSubarray(self, nums: List[int]) -> int:
size = len(nums)
min_num = float('inf')
max_num = float('-inf')
for i in range(1, size):
if nums[i] < nums[i-1]:
min_num = min(min_num, nums[i])
max_num = max(max_num, nums[i-1])
start = size-1
end = 0
for i in range(size):
if nums[i] > min_num:
start = i
break
for i in range(size-1, -1, -1):
if nums[i] < max_num:
end = i
break
return end - start + 1 if end - start > 0 else 0