Shortest Unsorted Continuous Subarray

Head on over here to try the problem for yourself.

I solved this problem using a two-pointer method.

Algorithm

The goal is to find the points where the array becomes unsorted. We use two loops, one to find the end of the unsorted sub-array and another to find the start of the unsorted sub-array. start = end = -1 as a way to check if they were updated or not during the loops. If they were not, then array is sorted and we return 0. Else we return end - start + 1.

Code

pbulic int findUnsortedSubarray(int[] nums) {
  int start = -1;
  int end = -1;

  int prev = 0;
  //finding end
  for(int i = 0; i < nums.length - 1; i++) {
    // try to find the index of next 
    // smallest number from prev
    if(nums[i] < nums[prev]) end = i;
    else prev = i;
  }

  int prev = nums.length - 1;
  //finding start
  for(int i = nums.length - 1; i >= 0; i--) {
    // try to find the index of nex
    // biggest number from prev
    if(nums[i] > nums[prev]) start = i;
    else prev = i;
  }

  return (start < 0 && end < 0) ? 0 : end - start + 1;
}

Testcases

[1,3,2,2,2]
start = 1
end = 4

An odd testcase that shows the strage loop working. In this case, the whole right side of the array is unsorted. For finding end, we would have the following run:

i prev end
0 0 -1
1 1 -1
2 1 2
3 1 3
4 1 4

Finding start happens simlarly and we get a good result.