C++ 数组循环左移:时间复杂度 O(n),空间复杂度 O(1)
可以使用三次翻转来实现数组的循环左移。
首先,将数组的前 k 个元素进行翻转; 然后,将数组的剩余部分进行翻转; 最后,将整个数组进行翻转。
下面是具体的实现代码:
#include <iostream>
using namespace std;
// 翻转数组的函数
void reverse(int A[], int start, int end) {
while (start < end) {
int temp = A[start];
A[start] = A[end];
A[end] = temp;
start++;
end--;
}
}
// 循环左移数组的函数
void rotateLeft(int A[], int n, int k) {
k = k % n; // 如果 k 大于 n 的话,取余数
reverse(A, 0, k - 1); // 翻转前 k 个元素
reverse(A, k, n - 1); // 翻转剩余部分
reverse(A, 0, n - 1); // 翻转整个数组
}
int main() {
int A[] = {1, 2, 3, 4, 5};
int n = sizeof(A) / sizeof(A[0]);
int k = 2;
rotateLeft(A, n, k);
cout << '循环左移后的数组为:';
for (int i = 0; i < n; i++) {
cout << A[i] << ' ';
}
cout << endl;
return 0;
}
输出结果为:
循环左移后的数组为:3 4 5 1 2
这样就实现了将数组循环左移 k 个位置的功能,时间复杂度为 O(n),空间复杂度为 O(1)。
原文地址: https://www.cveoy.top/t/topic/eKPv 著作权归作者所有。请勿转载和采集!