设a[0:n-1]是有 n 个元素的数组,k(0≤k≤n-1)是一个非负整数。设计一个算法将子数组a[0 : k-1]和a[k : n-1]换位。要求算法在最坏情况下耗时 O(n),且只用到 O(1)的辅助空间。 给出能运行的c++代码
时间: 2024-09-19 20:02:24 浏览: 37
要解决这个问题,可以采用双指针法,即使用两个指针i和j分别从数组的开始和结束向中间移动。当i到达k位置时,就完成了交换操作,因为j会比i快一步到达k的位置,并将a[i]与a[j]对调。这个过程可以在一次遍历中完成,所以时间复杂度为O(n)。以下是C++的示例代码:
```cpp
#include <iostream>
void swapSubArrays(int a[], int n, int k) {
if (n <= 1 || k >= n) { // 如果数组长度小于等于1或者k越界,无需交换
return;
}
int i = 0; // 指针i从开始
int j = n - 1; // 指针j从结束
while (i < k && j > k) { // 当i未达到k并且j超过k时
std::swap(a[i], a[j]); // 交换a[i]和a[j]
++i; // i向前移动一位
--j; // j向后移动一位
}
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int k = 2;
std::cout << "Before swapping: ";
for (int i : arr) {
std::cout << i << " ";
}
swapSubArrays(arr, n, k);
std::cout << "\nAfter swapping: ";
for (int i : arr) {
std::cout << i << " ";
}
return 0;
}
```
这个代码会在控制台上显示原始数组和交换后的数组。注意,这个解决方案仅用到了固定大小的临时变量`i`和`j`,因此辅助空间复杂度为O(1)。
阅读全文