一、题目
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
二、题解
解题思路:使用三次逆转法,让数组旋转k次
1. 先整体逆转
2. 逆转子数组[0, k - 1]
3. 逆转子数组[k, size - 1]
先举个例子:
对于3 4 2 1 5这组数字,如果k为2,则旋转结果为1 5 3 4 2
如果我们先把整个数组逆序,得到5 1 2 4 3
再逆转两个子数组,得到 1 5 3 4 2
是不是很神奇!!
void reverse(int* nums, int begin, int end)
{
while (begin < end)
{
int tmp = nums[begin];
nums[begin] = nums[end];
nums[end] = tmp;
++begin;
--end;
}
}
// 三趟逆置倒的思路
void rotate(int* nums, int numsSize, int k) {
if (k > numsSize)
{
k %= numsSize;
}
reverse(nums, 0, numsSize - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, numsSize - 1);
}