cpp
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
vector<int>res(n,0);
for(int i=0;i<n;i++){
res[(i+k)%n] = nums[i];
}
nums = res;
}
};
这段代码的核心思路是:先把每个元素放到旋转后的新位置,再把结果赋值回原数组。
例如原数组:
nums = {1,2,3,4,5,6,7};
k = 3;
数组长度:
n = 7;
创建一个临时数组:
vector<int> res(n, 0);
然后遍历原数组,把原来下标为 i 的元素放到:
(i + k) % n
这个新位置中。例如:
nums[0] = 1
原下标是 0,右移 3 位后:
(0 + 3) % 7 = 3
所以:
res[3] = 1;
再比如:
nums[5] = 6
新下标:
(5 + 3) % 7 = 1
所以:
res[1] = 6;
这里 % n 的作用就是超过数组末尾后重新绕回数组开头。
全部移动完成后:
res = {5,6,7,1,2,3,4};
最后:
nums = res;
把旋转后的结果整体赋值回 nums。因为 nums 是引用参数:
vector<int>& nums
所以原数组也会真正被修改。
可以直接记成一句话:
原位置
i的元素,右移k位后的新位置是(i+k)%n,全部放进res后,再执行nums = res。
题解2:翻转数组
cpp
class Solution {
public:
void reverse(vector<int>& nums, int start, int end) {
while (start < end) {
swap(nums[start], nums[end]);
start += 1;
end -= 1;
}
}
void rotate(vector<int>& nums, int k) {
k %= nums.size();
reverse(nums, 0, nums.size() - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.size() - 1);
}
};
nums = "----->-->"; k =3
result = "-->----->";
reverse "----->-->" we can get "<--<-----"
reverse "<--" we can get "--><-----"
reverse "<-----" we can get "-->----->"
this visualization help me figure it out :)