【发布时间】:2019-11-25 22:47:42
【问题描述】:
问题
每当乔治约莉莉出去玩时,她都在忙着做作业。乔治想帮助她更快地完成它,但他在他的头上!你能帮助乔治了解莉莉的作业,这样她就可以和他一起出去玩吗?
考虑一个由 n 不同整数组成的数组 arr=[a[0],...,a[n-1]] 。 George 可以任意交换数组的任意两个元素。如果0 < i < n 中的|a[i]-a[i-1]| > 0 之和最小,则数组是美丽的。
给定数组arr,确定并返回为使数组美观而应执行的最小交换次数。
例如,arr = [7,15,12,3]。一个最小数组是[3, 7, 12, 15]。为此,George 执行了以下交换:
Swap Result
[7, 15, 12, 3]
3 7 [3, 15, 12, 7]
7 15 [3, 7, 12, 15]
需要2 交换才能使阵列美观。在可能的漂亮数组的选择中,这是最小的。
输入格式
第一行包含一个整数
n,元素个数 在arr。第二行包含n空格分隔的整数arr[i].约束
0 < n < 1000010 < arr[i] < 2000000001输出格式
返回使数组美观所需的最小交换次数。
示例输入
4 2 5 3 1样本输出
2
我的努力
我计算了将arr 元素与其按升序和降序排序的版本进行比较的交换次数。但由于某种原因,我得到了错误的结果。
代码
int findSwaps(vector<int>& arr, const vector<int>& sortedArr, std::map<int, int> arrIndexMap) {
int swaps = 0;
int size = arr.size();
for (int i = 0; i < size; i++) {
if (arr[i] != sortedArr[i]) {
swaps++;
int j = arrIndexMap[sortedArr[i]];
arrIndexMap[arr[i]] = j;
arrIndexMap[arr[j]] = i;
arr[j] = arr[i];
arr[i] = sortedArr[i];
}
}
return swaps;
}
int main() {
int n;
cin >> n;
std::vector<int> arr(n);
for (int i = 0; i < n; i++) {
int value;
cin >> value;
arr.push_back(value);
}
std::map<int, int> arrIndexMap;
for (int i = 0; i < n; i++) {
arrIndexMap[arr[i]] = i;
}
std::vector<int> sortedArr = arr;
std::sort(sortedArr.begin(), sortedArr.end());
std::vector<int> descSortedArr = arr;
std::sort(descSortedArr.begin(), descSortedArr.end(), std::greater<>());
int swaps1 = findSwaps(arr, sortedArr, arrIndexMap);
int swaps2 = findSwaps(arr, descSortedArr, arrIndexMap);
cout << std::min(swaps1, swaps2);
return 0;
}
输入
5
3 4 2 5 1
预期输出
2
实际输出
5
【问题讨论】:
标签: c++ arrays algorithm sorting