581. 最短无序连续子数组 - 力扣(Leetcode)https://leetcode.cn/problems/shortest-unsorted-continuous-subarray/description/第一种方法就是对整个数组进行排序,那么左边第一个开始不一样的,与右边第一个开始不一样的,这两者之间的距离就是连续的无序数组
class Solution:
def findUnsortedSubarray(self, nums):
lst=list(nums)
lst.sort()
i,j=0,len(lst)-1
while i<len(lst):
if lst[i]!=nums[i]:
break
i+=1
if i==len(lst):
return 0
while j>0:
if lst[j]!=nums[j]:
break
j-=1
return j-i+1
第二种方法如下
如果右边已经排好序了,肯定比左边的最大值还要大,所以这个数如果比左边最大值小,那么,这个数肯定不在右边已经排好序的数组中;
如果左边已经排好序了,肯定比右边最小值还小,如果它比右边最小值大,那么这个数肯定不在左边的已经排好序的数组中
这样就找到了两个有序数组的临界
class Solution:
def findUnsortedSubarray(self, nums):
le = len(nums)
maxx, minn = nums[0], nums[le - 1]
i, j = 0, le - 1
l,r=0,-1
while i < le:
if nums[i] < maxx:
r=i
maxx = nums[i] # 左边是升序嘛
i += 1
while j >= 0:
if nums[j] > minn:
l=j
minn = nums[j] # 左边是升序嘛
j -= 1
return r - l + 1
a=Solution()
print(a.findUnsortedSubarray([2,6,4,8,10,9,15]))