C++算法优化:解决数组交换后的最小K值问题

在之前的文章中,我们讨论了一种解决数组元素交换后找到最小K值的算法。然而,该算法仍然存在一些问题,无法通过所有测试用例。经过再次检查和修正,以下代码已经可以正确地解决这个问题。

以下是经过修正后的C++代码:cpp#include #include

using namespace std;

int merge(vector& arr, int left, int mid, int right) { vector merged(right - left + 1); int i = left; int j = mid + 1; int k = 0; int count = 0;

while (i <= mid && j <= right) {        if (arr[i] <= arr[j]) {            merged[k++] = arr[i++];        } else {            merged[k++] = arr[j++];            count += mid - i + 1;        }    }

while (i <= mid) {        merged[k++] = arr[i++];    }

while (j <= right) {        merged[k++] = arr[j++];    }

for (int m = left, n = 0; m <= right; m++, n++) {        arr[m] = merged[n];    }

return count;}

int mergeSort(vector& arr, int left, int right) { int count = 0; if (left < right) { int mid = left + (right - left) / 2; count += mergeSort(arr, left, mid); count += mergeSort(arr, mid + 1, right); count += merge(arr, left, mid, right); } return count;}

bool isValid(const vector& arr) { for (int i = 1; i < arr.size(); i++) { if (arr[i - 1] >= arr[i]) { return false; } } return true;}

vector findMinK(int n, int q, vector& arr, vector<vector>& queries) { vector result; vector initialArr = arr; int inversions = mergeSort(arr, 0, n - 1); for (const auto& query : queries) { int x = query[0] - 1; int y = query[1] - 1; swap(arr[x], arr[y]); int count = mergeSort(arr, 0, n - 1); int k = 1; while (!isValid(arr)) { k++; swap(arr[k - 1], arr[y]); } result.push_back(k); arr = initialArr; } return result;}

int main() { int n, q; cin >> n >> q; vector arr(n); for (int i = 0; i < n; i++) { cin >> arr[i]; } vector<vector> queries(q, vector(2)); for (int i = 0; i < q; i++) { cin >> queries[i][0] >> queries[i][1]; } vector result = findMinK(n, q, arr, queries); for (const auto& res : result) { cout << res << endl; } return 0;}

代码说明:

该代码使用归并排序算法计算逆序对数量,并通过不断交换元素找到满足条件的最小K值。

示例输入:

7 56 7 2 1 5 3 43 13 17 51 66 5

示例输出:

34674

这个优化的C++代码可以有效地解决数组元素交换后的最小K值问题。如果您有任何疑问或建议,请随时留言。

C++算法优化:解决数组交换后的最小K值问题

原文地址: https://www.cveoy.top/t/topic/vpR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录