Solution 1
class Solution:
def findUnsortedSubarray(self, nums: List[int]) -> int:
snums = sorted(nums)
right = 0
left = len(nums) - 1
for i in range(len(nums)):
if nums[i] != snums[i]:
right = max(right, i)
left = min(left, i)
return 0 if right-left<=0 else right-left+1
Time complexity is O(nlogn). Space complexity is O(n).
Solution 2
class Solution:
def findUnsortedSubarray(self, nums: List[int]) -> int:
maxnum = - float("inf")
minnum = nums[len(nums) - 1]
for i in range(1, len(nums) -1):
if nums[i] < nums[i-1]:
minnum = min(minnum, nums[i])
i = len(nums) - 2
while i >= 0:
if nums[i] > nums[i+1]:
maxnum = max(maxnum, nums[i])
i = i-1
left = 0
while left < len(nums):
if nums[left] > minnum:
break
left = left + 1
right = len(nums) - 1
while right >= 0:
if nums[right] < maxnum:
break
right = right - 1
return 0 if right-left<0 else right-left+1
Time complexity is O(n). Space complexity is O(1).