跳至主要内容

Minimum Swaps to Sort

Given an array of n distinct elements. Find the minimum number of swaps required to sort the array in strictly increasing order.

Example 1:

Input:
nums = {2, 8, 5, 4}

Output:
1

Explanation:
swap 8 with 4.

Example 2:

Input:
nums = {10, 19, 6, 3, 5}

Output:
2

Explanation:
swap 10 with 3 and swap 19 with 5.
#include <iostream>
#include <string>
#include <vector>
#include <utility>

using namespace std;

int minSwapsAscending(vector<int>& nums)
{
int n = nums.size();

vector<pair<int, int>> arr(n);
for (int i = 0; i < n; i++)
{
arr[i] = {nums[i], i};
}

sort(arr.begin(), arr.end());

vector<bool> seen(n);

int swaps = 0;

for (int i = 0; i < n; i++)
{
// If the element is already in the correct position or already visited
if (seen[i] || arr[i].second == i)
continue;

int cycleSize = 0;
int j = i;

while (!seen[j])
{
seen[j] = true;
j = arr[j].second;
cycleSize++;
}

if (cycleSize > 0)
{
swaps += (cycleSize - 1);
}
}
return swaps;
}

int minSwapsDescending(vector<int>& nums)
{
int n = nums.size();

vector<pair<int, int>> arrPos(n);
for (int i = 0; i < n; i++)
{
arrPos[i] = {nums[i], i};
}

sort(arrPos.rbegin(), arrPos.rend());

vector<bool> seen(n);

int swaps = 0;

for (int i = 0; i < n; i++)
{
if (seen[i] || arrPos[i].second == i)
{
continue;
}

int numOfCycles = 0;
int j = i;

while (!seen[j])
{
seen[j] = true;
j = arrPos[j].second;
numOfCycles++;
}

if (numOfCycles > 0)
{
swaps += (numOfCycles - 1);
}
}
return swaps;
}

int main()
{
vector<int> nums = {2, 8, 5, 4};
int r1 = minSwapsAscending(nums); // swap 8 and 4
int r2 = minSwapsDescending(nums); // swap 8 and 2, swap 2 and 5, swap 2 amd 4
printf("Ascending: %d, Descending: %d\n", r1, r2);
}
  • T: O(nlogn)O(n \cdot \log n)
  • S: O(n)O(n)