medium Minimum Adjacent Swaps to Make a Valid Array
Problem Statement
Given an integer array nums, return the minimum swaps required to make nums a valid array.
You can swap any two adjacent elements of the array.
An array is a valid array if it meets the following conditions:
- The
largestelement is at therightmostposition in the array. - The
smallestelement is at theleftmostposition in the array. - If there are
multiplesmallest and largest elements, any of the smallest elements should be at the leftmost position and any of the largest should be at the rightmost position.
Examples
-
Example 1:
- Input: nums =
[3, 1, 2] - Expected Output:
2 - Justification: The first swap moves
3to the second position by swapping with1, and the second swap moves3to the third position by swapping with2, positioning the smallest element (1) at the beginning and the largest element (3) at the end.
- Input: nums =
-
Example 2:
- Input: nums =
[1, 2, 3, 4] - Expected Output:
0 - Justification: This array already meets the criteria with the smallest element (1) at the start and the largest element (4) at the end, requiring no swaps.
- Input: nums =
-
Example 3:
- Input: nums =
[3, 5, 4, 5, 1, 2] - Expected Output:
5 - Justification: The smallest element (1) requires
4swaps to move to the beginning, and after that the largest element (5) requires1swap to move to the rightmost position, considering the optimal path that minimizes overall swaps.
- Input: nums =
Try it yourself
Try solving this question here:
✅ Solution Minimum Adjacent Swaps to Make a Valid Array
Problem Statement
Given an integer array nums, return the minimum swaps required to make nums a valid array.
You can swap any two adjacent elements of the array.
An array is a valid array if it meets the following conditions:
- The
largestelement is at therightmostposition in the array. - The
smallestelement is at theleftmostposition in the array. - If there are
multiplesmallest and largest elements, any of the smallest elements should be at the leftmost position and any of the largest should be at the rightmost position.
Examples
-
Example 1:
- Input: nums =
[3, 1, 2] - Expected Output:
2 - Justification: The first swap moves
3to the second position by swapping with1, and the second swap moves3to the third position by swapping with2, positioning the smallest element (1) at the beginning and the largest element (3) at the end.
- Input: nums =
-
Example 2:
- Input: nums =
[1, 2, 3, 4] - Expected Output:
0 - Justification: This array already meets the criteria with the smallest element (1) at the start and the largest element (4) at the end, requiring no swaps.
- Input: nums =
-
Example 3:
- Input: nums =
[3, 5, 4, 5, 1, 2] - Expected Output:
5 - Justification: The smallest element (1) requires
4swaps to move to the beginning, and after that the largest element (5) requires1swap to move to the rightmost position, considering the optimal path that minimizes overall swaps.
- Input: nums =
Solution
To solve this problem, we start by identifying the positions of the smallest and largest elements in the array. The strategy involves two main steps: moving the smallest element to the beginning and the largest to the end with adjacent swaps. This approach is efficient because it directly addresses the problem's requirements without unnecessary operations.
Initially, we focus on minimizing the swaps for the smallest element, considering its potential multiple occurrences and choosing the one closest to the start. Similarly, for the largest element, we aim to minimize its movement by selecting an occurrence closest to the end. This method is effective because it reduces the number of swaps by leveraging the initial positions of the target elements.
Step-by-Step Algorithm
-
Initialize two variables,
minValandmaxVal, to store the minimum and maximum values found in the array. SetminValto the highest possible integer value andmaxValto the lowest possible integer value to ensure they are updated during the first comparison. -
Initialize two variables,
minIndexandmaxIndex, to store the positions of the minimum and maximum values within the array. -
Iterate through the array once, from the first to the last element:
- For each element, if it is less than
minVal, updateminValwith this element's value andminIndexwith the current index. - For each element, if it is greater than or equal to
maxVal, updatemaxValwith this element's value andmaxIndexwith the current index.
- For each element, if it is less than
-
Calculate the total number of swaps needed to move the smallest element to the beginning and the largest element to the end. This is done by adding
minIndex(the number of swaps needed to move the smallest element to the start) to(n - 1 - maxIndex)(the number of swaps needed to move the largest element to the end), wherenis the length of the array. -
If the smallest element is positioned after the largest element (
minIndex > maxIndex), subtract one swap from the total. This adjustment is necessary because moving the largest element towards the end will simultaneously move the smallest element towards the start, thus overlapping one swap. -
Return the calculated total number of swaps.
Algorithm Walkthrough
-
Initialization:
minValis set toInteger.MAX_VALUE.maxValis set toInteger.MIN_VALUE.minIndexandmaxIndexare both initialized but not yet set.
-
Iterate through the array:
- Index 0: Encounter
3. UpdateminValto3and UpdatemaxValto3andmaxIndexto0. - Index 1: Encounter
5.minValremains unchanged. UpdatemaxValto5andmaxIndexto1. - Index 2: Encounter
4. No updates tominValormaxVal. - Index 3: Encounter another
5.minValremains unchanged. UpdatemaxValto5(same value, higher index) andmaxIndexto3. - Index 4: Encounter
1. UpdateminValto1andminIndexto4.maxValremains unchanged. - Index 5: Encounter
2. No updates tominValormaxVal.
- Index 0: Encounter
-
Calculate total swaps:
minIndexis4, andmaxIndexis3.- Total swaps =
minIndex + (n - 1 - maxIndex)=4 + (6 - 1 - 3)=4 + 2=6.
-
Adjust for overlap:
- Since
minIndex > maxIndex, we understand that one swap has been double-counted. - Adjust the total swaps by subtracting one:
6 - 1=5.
- Since
-
Conclusion:
- The minimum number of swaps required to make the array valid is
5.
- The minimum number of swaps required to make the array valid is
Code
public class Solution {
// Function to find the minimum number of swaps required
// to sort the given array in non-decreasing order
public int minSwaps(int[] nums) {
// Get the length of the input array
int n = nums.length;
// Initialize variables to store minimum and maximum values
int minVal = Integer.MAX_VALUE, maxVal = Integer.MIN_VALUE;
// Initialize variables to store indices of minimum and maximum values
int minIndex = -1, maxIndex = -1;
// Iterate through the array to find minimum and maximum values
for (int i = 0; i < n; i++) {
// Update minimum value and its index if found
if (nums[i] < minVal) {
minVal = nums[i];
minIndex = i;
}
// Update maximum value and its index if found
if (nums[i] >= maxVal) {
maxVal = nums[i];
maxIndex = i;
}
}
// Calculate the number of swaps required
int swaps = minIndex + (n - 1 - maxIndex);
// Adjust swaps if minimum index is to the right of maximum index
if (minIndex > maxIndex) swaps--;
// Return the minimum number of swaps required
return swaps;
}
// Main method to test the minSwaps function
public static void main(String[] args) {
Solution solution = new Solution();
// Test cases
System.out.println(solution.minSwaps(new int[] { 3, 1, 2 })); // Example 1
System.out.println(solution.minSwaps(new int[] { 1, 2, 3, 4 })); // Example 2
System.out.println(solution.minSwaps(new int[] { 3, 5, 4, 5, 1, 2 })); // Example 3
}
}
Complexity Analysis
Time Complexity:
The time complexity of the minSwaps method is nums. This efficiency is due to a single pass through the array to find the positions of the minimum and maximum elements, which requires looking at each element exactly once.
Space Complexity:
The space complexity is
🤖 Don't fully get this? Learn it with Claude
Stuck on Minimum Adjacent Swaps to Make a Valid Array? 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 Adjacent Swaps to Make a Valid Array** (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 Adjacent Swaps to Make a Valid Array** 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 Adjacent Swaps to Make a Valid Array**. 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 Adjacent Swaps to Make a Valid Array**. 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.