法一:
挨个旋转,记住最后一个数字,依次向后覆盖(效率较低,但简单暴力)
void rotate(int* nums, int numsSize, int k){
int i;
while(k)
{
int end=nums[numsSize-1];
for(i=numsSize-2;i>=0;i--)
{
nums[i+1]=nums[i];
}
nums[0]=end;
k--;
}
法二:
解题思路:使用三次逆转法,让数组旋转k次
1. 先整体逆转
2. 逆转子数组[0, k - 1]
3. 逆转子数组[k, size - 1]
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);
}