题目:
代码(首刷自解 2024年3月3日):
这是O(n)的空间复杂度,这题进阶要求O(1)的空间复杂度就复杂很多。我在评论区看到一个很精妙的解法,先翻转数组,再到k处,左右两边再翻转。原理是靠数学推导,这次就不用了,看看下次刷能不能想得起吧
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
int realstep = k % n;
vector<int> myArr(n);
int temp = nums[realstep];
for (int i = 0; i < n; ++i) {
myArr[(i + realstep) % n] = nums[i];
}
nums = myArr;
}
};
代码(二刷看解析 2024年4月4日)
知道了反转的思路,但是代码写错了,应该先反转整个,再反转局部,不然容易出错。
class Solution {
public:
void reverse(vector<int>& nums, int start, int end) {
while (start < end) {
swap(nums[start++], nums[end--]);
}
}
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);
}
};