法一:
挨个旋转,记住最后一个数字,依次向后覆盖(效率较低,但简单暴力)
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);
}