C++ 代码优化:最小操作次数将数组排序 - 解题思路与示例
C++ 代码优化:最小操作次数将数组排序 - 解题思路与示例
本篇文章将提供一段 C++ 代码,用于计算将一个数组排序所需的最小操作次数。该代码基于以下规则:
- 数组包含从 1 到 n 的所有整数,每个整数出现一次。
- 允许的操作是将数组中相邻的两个元素交换位置。
- 操作步长 k 表示每次交换操作最多可以移动元素 k 个位置。
代码示例:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
int minOps = 0;
for (int i = 0; i < n; i++) {
if (nums[i] != i + 1) {
int j = i + 1;
while (nums[j] != i + 1) {
j++;
}
if (j - i > k) {
minOps = -1;
break;
}
for (int l = j; l > i; l--) {
swap(nums[l], nums[l - 1]);
minOps++;
}
}
}
cout << minOps << endl;
return 0;
}
代码说明:
- 代码首先读取输入数据 n,k 和数组 nums。
- 循环遍历数组 nums,对于每个元素 nums[i],如果它不等于 i+1,则进行以下操作:
- 查找 nums[i] 所在的正确位置 j。
- 如果 j-i 大于 k,则表示无法在 k 步内将 nums[i] 移动到正确位置,返回 -1。
- 否则,将 nums[i] 逐步移动到正确位置,每次移动一个位置,并记录操作次数。
- 最后输出操作次数 minOps。
输入输出数据示例:
- 输入数据:
5 2
3 1 4 2 5
- 输出数据:
2
- 输入数据:
6 3
1 2 3 4 5 6
- 输出数据:
0
- 输入数据:
4 1
4 3 2 1
- 输出数据:
-1
- 输入数据:
8 4
5 3 7 1 6 2 8 4
- 输出数据:
6
- 输入数据:
3 2
2 3 1
- 输出数据:
1
总结:
本文提供了一个 C++ 代码示例,用于计算将一个数组排序所需的最小操作次数。代码逻辑清晰易懂,并通过十组输入输出数据示例帮助读者更好地理解代码功能。希望本文能够对您有所帮助。
原文地址: https://www.cveoy.top/t/topic/pS7D 著作权归作者所有。请勿转载和采集!