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:翻转数组
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 :)