hackerrank: sort by swaps
This commit is contained in:
parent
462be10393
commit
5562e47c37
|
|
@ -0,0 +1,133 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
# Minimum Swaps 2
|
||||||
|
|
||||||
|
https://www.hackerrank.com/challenges/minimum-swaps-2/problem
|
||||||
|
|
||||||
|
You are given an unordered array consisting of consecutive integers
|
||||||
|
|
||||||
|
[1, 2, 3, ..., n] without any duplicates. You are allowed to swap any two elements. You need to find the minimum number of swaps required to sort the array in ascending order.
|
||||||
|
|
||||||
|
For example, given the array arr = [7,1,3,2,4,5,6] we perform the following steps:
|
||||||
|
|
||||||
|
i arr swap (indices)
|
||||||
|
0 [7, 1, 3, 2, 4, 5, 6] swap (0,3)
|
||||||
|
1 [2, 1, 3, 7, 4, 5, 6] swap (0,1)
|
||||||
|
2 [1, 2, 3, 7, 4, 5, 6] swap (3,4)
|
||||||
|
3 [1, 2, 3, 4, 7, 5, 6] swap (4,5)
|
||||||
|
4 [1, 2, 3, 4, 5, 7, 6] swap (5,6)
|
||||||
|
5 [1, 2, 3, 4, 5, 6, 7]
|
||||||
|
|
||||||
|
It took 5 swaps to sort the array.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <bits/stdc++.h>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
vector<string> split_string(string);
|
||||||
|
|
||||||
|
// Complete the minimumSwaps function below.
|
||||||
|
int minimumSwaps2(vector<int> arr)
|
||||||
|
{
|
||||||
|
int swaps = -1;
|
||||||
|
vector<bool> vis(arr.size(), false);
|
||||||
|
for (size_t i = 0; i < arr.size(); i++)
|
||||||
|
{
|
||||||
|
if (vis[i] || arr[i] == i + 1)
|
||||||
|
{
|
||||||
|
vis[i] = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int val = arr[i];
|
||||||
|
while (!vis[val - 1])
|
||||||
|
{
|
||||||
|
vis[val - 1] = true;
|
||||||
|
val = arr[val - 1];
|
||||||
|
swaps++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return swaps;
|
||||||
|
}
|
||||||
|
|
||||||
|
// numbers don't necessarily need to be consecutive, could be 1,2,3,77,88,6
|
||||||
|
int minimumSwaps(vector<int> arr){
|
||||||
|
int first = 0;
|
||||||
|
int last = arr.size() - 1;
|
||||||
|
int swaps = 0;
|
||||||
|
while (first < last){
|
||||||
|
while (arr[first] == first + 1 && first < last){
|
||||||
|
first++;
|
||||||
|
}
|
||||||
|
if (first < last){
|
||||||
|
int temp = arr[arr[first] - 1];
|
||||||
|
arr[arr[first] - 1] = arr[first];
|
||||||
|
arr[first] = temp;
|
||||||
|
swaps++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return swaps;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
ofstream fout(getenv("OUTPUT_PATH"));
|
||||||
|
|
||||||
|
int n;
|
||||||
|
cin >> n;
|
||||||
|
cin.ignore(numeric_limits<streamsize>::max(), '\n');
|
||||||
|
|
||||||
|
string arr_temp_temp;
|
||||||
|
getline(cin, arr_temp_temp);
|
||||||
|
|
||||||
|
vector<string> arr_temp = split_string(arr_temp_temp);
|
||||||
|
|
||||||
|
vector<int> arr(n);
|
||||||
|
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
int arr_item = stoi(arr_temp[i]);
|
||||||
|
|
||||||
|
arr[i] = arr_item;
|
||||||
|
}
|
||||||
|
|
||||||
|
int res = minimumSwaps(arr);
|
||||||
|
|
||||||
|
fout << res << "\n";
|
||||||
|
|
||||||
|
fout.close();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<string> split_string(string input_string)
|
||||||
|
{
|
||||||
|
string::iterator new_end = unique(input_string.begin(), input_string.end(), [](const char &x, const char &y) {
|
||||||
|
return x == y and x == ' ';
|
||||||
|
});
|
||||||
|
|
||||||
|
input_string.erase(new_end, input_string.end());
|
||||||
|
|
||||||
|
while (input_string[input_string.length() - 1] == ' ')
|
||||||
|
{
|
||||||
|
input_string.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<string> splits;
|
||||||
|
char delimiter = ' ';
|
||||||
|
|
||||||
|
size_t i = 0;
|
||||||
|
size_t pos = input_string.find(delimiter);
|
||||||
|
|
||||||
|
while (pos != string::npos)
|
||||||
|
{
|
||||||
|
splits.push_back(input_string.substr(i, pos - i));
|
||||||
|
|
||||||
|
i = pos + 1;
|
||||||
|
pos = input_string.find(delimiter, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
splits.push_back(input_string.substr(i, min(pos, input_string.length()) - i + 1));
|
||||||
|
|
||||||
|
return splits;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue