Shortest Unsorted Continuous Subarray

medium array two pointers monotonic stack

Problem

Given an integer array nums, find the length of the shortest contiguous subarray such that sorting that subarray alone makes the whole array non-decreasing. Return 0 if it is already sorted.

Inputnums = [2, 6, 4, 8, 10, 9, 15]
Output5
Sort [6, 4, 8, 10, 9] to make the whole array sorted.

def find_unsorted_subarray(nums):
    n = len(nums)
    right = -1
    cur_max = float('-inf')
    for i in range(n):
        if nums[i] < cur_max:
            right = i
        else:
            cur_max = nums[i]
    left = 0
    cur_min = float('inf')
    for i in range(n - 1, -1, -1):
        if nums[i] > cur_min:
            left = i
        else:
            cur_min = nums[i]
    return 0 if right == -1 else right - left + 1
function findUnsortedSubarray(nums) {
  const n = nums.length;
  let right = -1, max = -Infinity;
  for (let i = 0; i < n; i++) {
    if (nums[i] < max) right = i;
    else max = nums[i];
  }
  let left = 0, min = Infinity;
  for (let i = n - 1; i >= 0; i--) {
    if (nums[i] > min) left = i;
    else min = nums[i];
  }
  return right === -1 ? 0 : right - left + 1;
}
class Solution {
    public int findUnsortedSubarray(int[] nums) {
        int n = nums.length, right = -1, max = Integer.MIN_VALUE;
        for (int i = 0; i < n; i++) {
            if (nums[i] < max) right = i;
            else max = nums[i];
        }
        int left = 0, min = Integer.MAX_VALUE;
        for (int i = n - 1; i >= 0; i--) {
            if (nums[i] > min) left = i;
            else min = nums[i];
        }
        return right == -1 ? 0 : right - left + 1;
    }
}
int findUnsortedSubarray(vector<int>& nums) {
    int n = nums.size(), right = -1, maxv = INT_MIN;
    for (int i = 0; i < n; i++) {
        if (nums[i] < maxv) right = i;
        else maxv = nums[i];
    }
    int left = 0, minv = INT_MAX;
    for (int i = n - 1; i >= 0; i--) {
        if (nums[i] > minv) left = i;
        else minv = nums[i];
    }
    return right == -1 ? 0 : right - left + 1;
}
Time: O(n) Space: O(1)