// 给定一个整数数组 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]
//方法一:每次移动一个,移动n次
//优点:简单容易实现
//缺点:时间复杂度超级高,k*O(n)的复杂度
void input(int* nums, int numsSize)
{
int temp=nums[numsSize-1];
//前面的往后放
for(int i=numsSize-2;i>=0;i--)
{
nums[i+1]=nums[i];
}
nums[0]=temp;
}
void rotate(int* nums, int numsSize, int k)
{
for(int i=0;i<k;i++)
{
input(nums,numsSize);
}
}
//方法二:粘贴复制
//最容易想到的算法
//空间损失比较大,时间复杂度为O(n)
void rotate(int* nums, int numsSize, int k)
{
int* copy[numsSize];
for(int i=0;i<numsSize;i++)
{
copy[(i+k)%numsSize]=nums[i];
}
for(int i=0;i<numsSize;i++)
{
nums[i]=copy[i];
}
}
//方法三:利用翻转去完成
void swap(int* num1,int* num2)
{
int temp=*num2;
*num2=*num1;
*num1=temp;
}
void reverse(int* nums,int start,int end)
{
while(start<end)
{
swap(&nums[start],&nums[end]);
start++;
end--;
}
}
void rotate(int* nums, int numsSize, int k)
{
k%=numsSize;
reverse(nums,0,numsSize-1);
reverse(nums,0,k-1);
reverse(nums,k,numsSize-1);
}