Problem Link

Description


Given an integer array nums, you need to find one continuous subarray such that if you only sort this subarray in non-decreasing order, then the whole array will be sorted in non-decreasing order.

Return the shortest such subarray and output its length.

 

Example 1:

Input: nums = [2,6,4,8,10,9,15]
Output: 5
Explanation: You need to sort [6, 4, 8, 10, 9] in ascending order to make the whole array sorted in ascending order.

Example 2:

Input: nums = [1,2,3,4]
Output: 0

Example 3:

Input: nums = [1]
Output: 0

 

Constraints:

  • 1 <= nums.length <= 104
  • -105 <= nums[i] <= 105

 

Follow up: Can you solve it in O(n) time complexity?

Solution


Python3

class Solution:
    def findUnsortedSubarray(self, nums: List[int]) -> int:
        N = len(nums)
        
        prev = nums[0]
        end = 0
 
        for i in range(1, N):
            if nums[i] < prev:
                end = i
            else:
                prev = nums[i]
            
        prev = nums[-1]
        start = N - 1
 
        for i in range(N - 2, -1, -1):
            if nums[i] > prev:
                start = i
            else:
                prev = nums[i]
        
        if end != 0:
            return end - start + 1
        
        return 0