给一个数组,如【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);//整体逆置
-
- }
