题目:
给一个数组,如【1,2,3,4,5,6,7】,k=3。
要求得到新数组【5,6,7,1,2,3,4】。
方法一,思路和代码:
void rotate(int* nums, int numsSize, int k)
{
while (k)
{
int tmp = nums[numsSize - 1];//创建一个临时变量存放最后一个数
for (int end = numsSize - 2; end >= 0; --end)//循环数组元素个数的n-1次,因为最后一个数要前置,不用管
{
nums[end + 1] = nums[end];//后一个数被前一个数替代,n-1个数右移一次
}
nums[0] = tmp;//将最后一个数放在首元素的位置
k--;//循环k次
}
}
方法二,思路:
//方法二(时间复杂度:O(N),空间复杂度:O(N))
//以空间换时间,再创建一个数组,存放要右旋的变量。
//举例说明:【1,2,3,4,5,6,7】,右旋三
//将后三个(k个),存放在一个数组中,【5,6,7】,再右移动四个数的位置(n-k)【1,2,3,4】
//也就成了【5,6,7,1,2,3,4】(这个方法比较简单好想,这里不做代码展示)
方法三,思路和代码(最牛):
//方法三(牛),时间复杂度和空间复杂度都最小
//思路:1.后k个逆置
// 2.前n-k个逆置
// 3.最后整体逆置
//如【1,2,3,4,5,6,7】,k=3
//1.【1,2,3,4,7,6,5】
//2.【4,3,2,1,7,6,5】
//3.【5,6,7,1,2,3,4】
void Reverse(int* nums, int left, int right)//逆置代码
{
while (left < right)
{
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = nums[left];
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k)
{
if (k >= numsSize)//当k大于数组长度时,对k%数组长度,取余,例如k=13,numsSize=7,k=6和k=13是一样的,但不取余的话会运行出错
{
k %= numsSize;
}
Reverse(nums, numsSize-k, numsSize - 1);//后面逆置
Reverse(nums, 0, numsSize -k-1);//前面逆置
Reverse(nums, 0, numsSize - 1);//整体逆置
}