「力扣面试经典150题」189. 轮转数组
题目描述
给定长度为$n$的数组
要求使用空间复杂度为
思路1:
比较粗糙一点的想法是,选定某个位置,从当前位置开始往后找到右边第k个位置,进行赋值,继续找下一个,知道回到最初选定的位置
但是很显然,有的时候不会只走一圈就全部轮转成功,我们需要考虑一下最少需要选几个数字可以覆盖整个数组。
假设从0出发,回到0的时候一共走了
class Solution {
public:
int gcd(int x, int y){
if(y == 0)return x;
return gcd(y, x % y);
}
void rotate(vector<int>& num, int k) {
int n = num.size();
k %= n;
if(k == 0)return;
for(int p = 0; p < gcd(n, k); ++p){
int u = p, x = num[u], y = 0;
do{
int v = (u + k) % n;
y = num[v];
num[v] = x;
x = y;
u = v;
}while(u != p);
}
}
};
思路2:
三次翻转数组
首先把整个数组反转一遍,再将前
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
k %= n;
if(k == 0)return;
reverse(nums.begin(), nums.end());
for(int l = 0, r = k - 1; l < r; ++l, --r){
swap(nums[l], nums[r]);
}
for(int l = k, r = n - 1; l < r; ++l, --r){
swap(nums[l], nums[r]);
}
}
};