轮转数组
问题描述
给你一个数组,将数组中的元素向右轮转
k
个位置,其中k
是非负数。
示例
输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4] 输入:nums = [-1,-100,3,99], k = 2 输出:[3,99,-1,-100] 解释: 向右轮转 1 步: [99,-1,-100,3] 向右轮转 2 步: [3,99,-1,-100]
解题思路:可以分三趟逆置
- 前N-K个数逆置
- 后K个逆置
- 整体逆置
画图分析:
代码实现:
void Inverse(int* nums, int n, int m)
{
int i = n;
int j = m - 1;
while (i < j)
{
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
i++; j--;
}
}
void rotate(int* nums, int numsSize, int k)
{
k = k %numsSize;
Inverse(nums, 0, numsSize - k);
Inverse(nums, numsSize - k, numsSize);
Inverse(nums, 0, numsSize);
}
结果如下: