1、题目描述:
LeetCode链接:https://leetcode-cn.com/problems/rotate-array/
2、解题方法:
解法1:
右旋一次,将最后一个数值保存到 temp 中,数组中其余的数依次向右移动一位,再把 temp 放到最左边。然后重复 k 次上述操作。
-
时间复杂度:O( N * (K%N) ) (右旋 k = N 次后,又回到原数组,所以取模。K%N = 0 时是最好情况 O(1),k = N - 1 时是最坏情况 O(N2) )
-
-空间复杂度:O(1)
代码如下:
void rotate(int* nums, int numsSize, int k)
{
k %= numsSize; //k对nums长度取余
int j = 0;
//右旋 k 次
for(j = 1; j <= k; j++)
{
//右旋一次
int temp = nums[numsSize-1]; //注意
int i = 0;
for(i = numsSize - 1; i > 0; i--) //依次向右移动
{
nums[i]=nums[i - 1];
}
nums[0] = temp; //注意
}
}
解法2:
新建一个空间大小和 nums 相同的数组,从后往前,将原数组后 k 个元素依次放到新数组前面,然后从前往后,将原数组前 n- k 个元素依次放到新数组后面。
-
时间复杂度:O(N)
-
空间复杂度:O(N)
代码如下:
void rotate(int* nums, int numsSize, int k)
{
int newArr[numsSize];
//挪动到新数组
k %= numsSize; // k对 nums长度取余
int i = numsSize - k, j = 0;
int temp = k;
//挪动后 k 项到新数组
while (temp)
{
newArr[j++] = nums[i++];
temp--;
}
//挪动前[0,n-k]项到新数组
for (i = 0; i < numsSize - k; i++)
{
newArr[j++] = nums[i];
}
//拷贝回原数组 nums
for (i = 0; i < numsSize; i++)
{
nums[i] = newArr[i];
}
}
解法3:
三部翻转法:
-
时间复杂度:O(N)
-
空间复杂度:O(1)
代码如下:
//翻转元素
void reverse(int* nums, int begin, int end)
{
while (begin < end)
{
int temp = nums[begin];
nums[begin] = nums[end];
nums[end] = temp;
begin++;
end--;
}
}
//右旋 k个数
void rotate(int* nums, int numsSize, int k)
{
k %= numsSize; // k对 nums长度取余
reverse(nums, 0, numsSize - k - 1); //翻转前 n-k 个元素
reverse(nums, numsSize - k, numsSize - 1); //翻转后 k 个数
reverse(nums, 0, numsSize - 1); //翻转所有数
}
大家快去动手试试吧!