给定一个整数数组 nums
,将数组中的元素向右轮转 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]
思路1.暴力求解:
时间复杂度:O(N^2)
空间复杂度:O(1)
如果k超出了数组的大小,就会进行无意义的轮换,所以首先让k%numsSize,只进行有意义的轮换
代码:
#include<assert.h>
#include<assert.h>
void rotate(int* nums, int numsSize, int k)
{
assert(nums);
k %= numsSize;//只需要进行有效的轮转
int i = 0;
for (i = 0; i < k; i++)
{
//代表需要轮转k次
int tmp = nums[numsSize - 1];//之后为轮转过程
int j = 0;
for (j = numsSize - 1; j > 0; j--)
{
nums[j] = nums[j - 1];
}
nums[0] = tmp;
}
}
运行结果:
思路2:以空间换时间
OJ代码:
void rotate(int* nums, int numsSize, int k)
{
int* tmp = (int*)malloc(sizeof(int) * numsSize);
int n = numsSize;
k %= n;
memcpy(tmp, nums + n - k, sizeof(int) * k);
memcpy(tmp + k, nums, sizeof(int) * (n - k));
memcpy(nums, tmp, sizeof(int) * n);
free(tmp);
tmp = NULL;
}
方法2新开了一个额外的空间
思路3:先局部再全局反转
代码:
#include<stdio.h>
#include<assert.h>
void reverse(int *left, int *right)
{
assert(left && right);
while (left < right)
{
int tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void rotate(int *nums, int numsSize, int k)
{
k %= numsSize;
int n = numsSize;
reverse(nums, nums + numsSize - k - 1);
reverse(nums + numsSize - k, nums + numsSize - 1);
reverse(nums, nums + numsSize - 1);
}
int main()
{
int nums[] = { 1, 2, 3, 4, 5, 6, 7 };
int k = 3;
int sz = sizeof(nums) / sizeof(nums[0]);
rotate(nums, sz, k);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", nums[i]);
}
return 0;
}
运行结果:
OJ代码:
//#include<stdio.h>
//#include<assert.h>
void reverse(int* left, int* right)
{
assert(left && right);
while (left < right)
{
int tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k)
{
int n = numsSize;
k %= n;
reverse(nums + n - k, nums + n - 1);
reverse(nums, nums + n - k - 1);
reverse(nums, nums + n - 1);
}
//int main()
//{
// int nums[] = { 1, 2, 3, 4, 5, 6, 7 };
// int k = 3;
// int sz = sizeof(nums) / sizeof(nums[0]);
// rotate(nums, sz, k);
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// printf("%d ", nums[i]);
// }
// return 0;
//}