medium Minimum Window Sort
Problem Statement
Given an array, find the length of the smallest subarray in it which when sorted will sort the whole array.
Example 1:
Input: [1, 2, 5, 3, 7, 10, 9, 12]
Output: 5
Explanation: We need to sort only the subarray [5, 3, 7, 10, 9] to make the whole array sorted
Example 2:
Input: [1, 3, 2, 0, -1, 7, 10]
Output: 5
Explanation: We need to sort only the subarray [1, 3, 2, 0, -1] to make the whole array sorted
Example 3:
Input: [1, 2, 3]
Output: 0
Explanation: The array is already sorted
Example 4:
Input: [3, 2, 1]
Output: 3
Explanation: The whole array needs to be sorted.
Constraints:
- 1 <= arr.length <= 104
- -105 <= arr[i] <= 105
Try it yourself
Try solving this question here:
✅ Solution Minimum Window Sort
Problem Statement
Given an array, find the length of the smallest subarray in it which when sorted will sort the whole array.
Example 1:
Input: [1, 2, 5, 3, 7, 10, 9, 12]
Output: 5
Explanation: We need to sort only the subarray [5, 3, 7, 10, 9] to make the whole array sorted
Example 2:
Input: [1, 3, 2, 0, -1, 7, 10]
Output: 5
Explanation: We need to sort only the subarray [1, 3, 2, 0, -1] to make the whole array sorted
Example 3:
Input: [1, 2, 3]
Output: 0
Explanation: The array is already sorted
Example 4:
Input: [3, 2, 1]
Output: 3
Explanation: The whole array needs to be sorted.
Constraints:
- 1 <= arr.length <= 104
- -105 <= arr[i] <= 105
Solution
As we know, once an array is sorted (in ascending order), the smallest number is at the beginning and the largest number is at the end of the array. So if we start from the beginning of the array to find the first element which is out of sorting order i.e., which is smaller than its previous element, and similarly from the end of array to find the first element which is bigger than its previous element, will sorting the subarray between these two numbers result in the whole array being sorted?
Let’s try to understand this with Example-2 mentioned above. In the following array, what are the first numbers out of sorting order from the beginning and the end of the array:
[1, 3, 2, 0, -1, 7, 10]
Starting from the beginning of the array the first number out of the sorting order is ‘2’ as it is smaller than its previous element which is ‘3’. Starting from the end of the array the first number out of the sorting order is ‘0’ as it is bigger than its previous element which is ‘-1’ As you can see, sorting the numbers between ‘3’ and ‘-1’ will not sort the whole array. To see this, the following will be our original array after the sorted subarray:
[1, -1, 0, 2, 3, 7, 10]
The problem here is that the smallest number of our subarray is ‘-1’ which dictates that we need to include more numbers from the beginning of the array to make the whole array sorted. We will have a similar problem if the maximum of the subarray is bigger than some elements at the end of the array. To sort the whole array we need to include all such elements that are smaller than the biggest element of the subarray.
Step-by-step Algorithm
- Initialize Pointers: Set
lowto 0 andhighto the last index of the array. - Find Left Boundary:
- Move
lowto the right while the current element is less than or equal to the next element.
- Move
- Check If Sorted:
- If
lowreaches the end, the array is already sorted. Return 0.
- If
- Find Right Boundary:
- Move
highto the left while the current element is greater than or equal to the previous element.
- Move
- Find Min and Max:
- Iterate from
lowtohighto find the minimum and maximum values in this subarray.
- Iterate from
- Extend Left Boundary:
- Move
lowto the left while the previous element is greater than the subarray's minimum.
- Move
- Extend Right Boundary:
- Move
highto the right while the next element is less than the subarray's maximum.
- Move
- Calculate Length:
- The length of the subarray to be sorted is
high - low + 1.
- The length of the subarray to be sorted is
Algorithm Walkthrough
Using the input [1, 3, 2, 0, -1, 7, 10]:
- Initialize Pointers:
low = 0,high = 6. - Find Left Boundary:
- Compare
1and3, movelowto1. - Compare
3and2, stop.low = 1.
- Compare
- Find Right Boundary:
- Compare
10and7, movehighto5. - Compare
7and-1, movehighto4. - Compare
-1and0, stop at4.
- Compare
- Find Min and Max:
- Subarray is
[3, 2, 0, -1]. - Minimum is
-1, Maximum is3.
- Subarray is
- Extend Left Boundary:
1is greater than-1,lowdecrements to0.
- Extend Right Boundary:
7is not less than3,highstays4.
- Calculate Length:
- Length is
high - low + 1=4 - 0 + 1 = 5.
- Length is
Here is the visual representation of this algorithm for Example 1:
Code
Here is what our algorithm will look like:
class Solution {
public int sort(int[] arr) {
int low = 0, high = arr.length - 1;
// find the first number out of sorting order from the beginning
while (low < arr.length - 1 && arr[low] <= arr[low + 1]) low++;
if (
low == arr.length - 1
) return 0; // if the array is sorted
// find the first number out of sorting order from the end
while (high > 0 && arr[high] >= arr[high - 1]) high--;
// find the maximum and minimum of the subarray
int subarrayMax = Integer.MIN_VALUE, subarrayMin = Integer.MAX_VALUE;
for (int k = low; k <= high; k++) {
subarrayMax = Math.max(subarrayMax, arr[k]);
subarrayMin = Math.min(subarrayMin, arr[k]);
}
// extend the subarray to include any number which is bigger than the minimum of
// the subarray
while (low > 0 && arr[low - 1] > subarrayMin) low--;
// extend the subarray to include any number which is smaller than the maximum of
// the subarray
while (high < arr.length - 1 && arr[high + 1] < subarrayMax) high++;
return high - low + 1;
}
public static void main(String[] args) {
Solution sol = new Solution();
System.out.println(sol.sort(new int[] { 1, 2, 5, 3, 7, 10, 9, 12 }));
System.out.println(sol.sort(new int[] { 1, 3, 2, 0, -1, 7, 10 }));
System.out.println(sol.sort(new int[] { 1, 2, 3 }));
System.out.println(sol.sort(new int[] { 3, 2, 1 }));
}
}
Complexity Analysis
Time Complexity
-
First and second while loops (finding
lowandhigh): The first twowhileloops each scan a portion of the array once to identify the first and last indices (lowandhigh) where the array is out of order. Both loops run intime, where Nis the length of the array. -
Subarray max and min calculation: The
forloop that finds the maximum and minimum values within the subarray betweenlowandhighruns at mostbecause it scans the array between lowandhigh. In the worst case, this could be the entire array. -
Third and fourth while loops (extending the subarray): These loops extend the subarray by comparing the elements outside the subarray with the
subarrayMinandsubarrayMax. Both of these loops run intime because they only scan the array once.
Overall time complexity: Each operation is
Space Complexity
-
Constant space: The algorithm uses only a few variables (
low,high,subarrayMax,subarrayMin, etc.), all of which require constant space,. -
In-place modification: The algorithm does not use any additional data structures that scale with the input size, and it processes the array in place.
Overall space complexity:
🤖 Don't fully get this? Learn it with Claude
Stuck on Minimum Window Sort? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.
Progressively stronger hints — you still solve it.
I'm working on the problem **Minimum Window Sort** (DSA). Give me a HINT LADDER: start with the tiniest nudge, then wait. Only reveal the next, stronger hint when I ask. Do NOT show the full solution unless I type 'show solution'. Keep me doing the thinking. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
See the technique, not just code.
Explain the optimal approach to **Minimum Window Sort** with a VISUAL walkthrough: trace it on a small concrete example using ASCII art / a step-by-step diagram, narrate what changes each step, then give time & space complexity with a one-line derivation. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
Catch bugs, edge cases, sub-optimality.
I'll paste my solution to **Minimum Window Sort**. Review it for correctness, missed edge cases, and time/space complexity, then coach me toward the optimal — don't just rewrite it. Ask me to paste my code now. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
Lock in recognition with look-alikes.
Give me 2 problems that use the SAME underlying pattern as **Minimum Window Sort**. For each, let me attempt first, then review my answer and name the trigger signal that reveals the pattern. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.