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