# 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*.

&#x20;

**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
```

&#x20;

**Constraints:**

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

&#x20;

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

```python
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
```
