581. Shortest Unsorted Continuous Subarray

Medium


Given an integer array nums, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending 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?

class Solution:
    def findUnsortedSubarray(self, nums: List[int]) -> int:
        stack = []
        left, right = len(nums), len(nums)
        for index, value in enumerate(nums):
            # Flag to decide whether to put value in stack or not
            flag = False
            # Check if stack top value if greater than this number
            if stack and stack[-1][1] > value:
                # Store top value of stack for later push
                top = stack[-1]
                # Keep popping values until we keep finding greater values from stack top
                while stack and stack[-1][1] > value:
                    new_left_index = stack.pop()[0]
                left = min(left, new_left_index)
                right = index + 1
                stack.append(top)
                flag = True
            # This flag prevents smaller values than stack top getting pushed into stack
            if not flag:
                stack.append([index, value])
        return right- left

Last updated