1、额外数组
我们可以使用额外数组来春芳轮转后的新数组。我们将原数组中第 i 位的元素放到新数组的第 (i + k) % n 位上,而后我们重新将新数组的内容赋给原数组即可。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
vector<int> newArr(n);
for (int i = 0; i < n; ++i) {
newArr[(i + k) % n] = nums[i];
}
nums.assign(newArr.begin(), newArr.end());
}
};
2、多次翻转
为了实现将数组向右轮转 n 位,我们可以执行如下的操作:
- 我们将整个数组进行反转;
- 我们将区间 [ 0 , k mod (n - 1) ]中的元素进行反转;
- 我们将区间 [ k mod n , n - 1 ]中的元素进行反转。
最终,我们可以获得一个已经向右轮转了 k 位的新数组。
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);
}
};