链接
https://leetcode-cn.com/problems/rotate-array/
耗时
解题:23 +10 min
题解:10 + 8 min
题意
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
思路
id | 思路 | 时间 | 空间 | 代码 |
---|---|---|---|---|
1 | 遍历一趟,记录每个位置是否移动过,如果没有则将当前元素往后移k位,后k位元素再往后移k位,如此继续,直到再次想移动当前元素为止;如果移动过则尝试下一个元素。 | O ( n ) O(n) O(n) | O ( n ) O(n) O(n) | code1 |
2 | 将循环节里的元素顺次移动,并记录每个循环节的长度;每次向后顺序遍历新的元素开始新的循环节,直到循环节的长度和等于数组的长度 | O ( n ) O(n) O(n) | O ( 1 ) O(1) O(1) | code2 |
AC代码
code1
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
k = k%n;
vector<bool> vis(n, false);
for(int i = 0; i < n; ++i) {
if(vis[i]) continue;
vis[i] = true;
int firstnum = nums[i];
int pos = (i+k)%n;
while(pos != i) {
vis[pos] = true;
swap(nums[i], nums[pos]);
pos = (pos+k)%n;
}
}
}
};
code2
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
k = k%n;
if(k == 0) return ;
int cirsum = 0;
for(int i = 0; cirsum < n; ++i) {
int pos = (i+k)%n;
int circnt = 1;
while(pos != i) {
swap(nums[i], nums[pos]);
pos = (pos+k)%n;
circnt++;
}
cirsum += circnt;
}
}
};