先看题目,如下:
方法一:原理见下方图解
viod rotate(int*nums,int numsSize,int k)
{
while(k--)
{
int tmp=nums[numsSize-1];
for(int i=numsSize-1;i>0;i--)
{
nums[i]=nums[i-1];
}
nums[0]=tmp;
}
//输出部分省略,用for循环打印即可
方法一的时间复杂度:O(N*K),空间复杂度:O(1)
方法一是我们很容易想到的方法,但比较耗时,如果要降低时间复杂度,就可以用方法二。
方法二:用空间换取时间的方法,原理见下方图解:
方法二的时间复杂度:O(N);空间复杂度:O(N)
void rotate(int* nums, int numsSize, int k)
{
int tmp[numsSize];//变长数组
k%=numsSize;
int j=0;
//后k个拷贝到前面去
for(int i=numsSize-k;i<numsSize;i++)
{
tmp[j]=nums[i];
j++;
}
//前numsSize-k个拷贝到后面来
for(int i=0;i<numsSize-k;i++)
{
tmp[j]=nums[i];
j++;
}
for(int i=0;i<numsSize;i++)
{
nums[i]=tmp[i];
}
return 0;
}