【LeetCode刷题记录】Rotate Array
来源:互联网 发布:linux查看软件版本 编辑:程序博客网 时间:2024/05/22 03:36
题目:Rotate Array
Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].
Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
解答:
题意是实现数组循环右移k位,这题主要是考察空间复杂度。
解法一:Copy法
最直接的方法就是开辟一个temp[n]数组,暂存nums[n]元素,方便移位赋值,但这种方法空间复杂度为O(n)。最开始,我是分[0,n-k-1]和[n-k,n-1]两部分处理,如下所示:
void rotate(int nums[], int n, int k) { int temp[n], i; k = k%n; // k modulo n to limit k in [0,n-1] for(i=0; i<n; i++) temp[i] = nums[i]; for(i=0; i<n-k; i++) nums[i+k] = temp[i]; for(i=n-k; i<n; i++) nums[i-n+k] = temp[i];}
在review讨论区的解答时,发现这两部可以合并成一部分,只需要引入取模操作。优化代码如下所示:
void rotate(int nums[], int n, int k) { if ((n == 0) || (k <= 0)) // exception handle is essential return; int temp[n], i; k = k%n; // k modulo n to limit k in [0,n-1] for(i=0; i<n; i++) temp[i] = nums[i]; for(i=0; i<n; i++) nums[(i+k)%k] = temp[i];}
解法二:递推移位法
单独考虑每一次移位操作,假设a[7] = {1,2,3,4,5,6,7},k = 3。那么,a[0]要移位到a[3],即a[3] = a[0]。同时,原来的a[3]要移位到a[6],所以在进行a[0]移位前,必须用一个中间数temp暂存a[3]的值。以此类推,一直到要移位的元素下标回到最初的地方(a[0])。这种方法空间复杂度为O(1)参考的讨论区代码如下:
void rotate(int nums[], int n, int k) { if ((n == 0) || (k <= 0)) { return; } int cntRotated = 0; int start = 0; int curr = 0; int numToBeRotated = nums[0]; int tmp = 0; // Keep rotating the elements until we have rotated n // different elements. while (cntRotated < n) { do { tmp = nums[(curr + k)%n]; nums[(curr+k)%n] = numToBeRotated; numToBeRotated = tmp; curr = (curr + k)%n; cntRotated++; } while (curr != start); // Stop rotating the elements when we finish one cycle, // i.e., we return to start. // Move to next element to start a new cycle. start++; curr = start; numToBeRotated = nums[curr]; } }
更多解法参考链接:
Summary of C++ solutions
0 0
- 【LeetCode刷题记录】Rotate Array
- 【LeetCode刷题记录】Merge Sorted Array
- leetcode刷题记录
- leetcode刷题记录
- leetcode刷题记录
- leetcode 刷题记录
- leetcode刷题记录
- Leetcode刷题记录
- Leetcode刷题记录
- leetcode 刷题记录
- LeetCode刷题记录
- 【LeetCode刷题记录】
- [LeetCode刷题记录]Search in Rotated Sorted Array
- LeetCode刷题记录 Single Element in A Sorted Array
- leetCode 刷题记录 Candy
- LeetCode 刷题记录 目录
- [leetcode 刷题记录] 167. Two Sum II - Input array is sorted
- leetcode刷题记录4--依然数组
- OC多文件开发
- 第13题:取链表中倒数第K个结点
- 高效的jQuery代码编写技巧总结
- WM消息及其lParam和wParam参数定义
- mysql 提取某字段内容插入到某个字段
- 【LeetCode刷题记录】Rotate Array
- 深入理解 scrollTo()、scrollBy()、getScrollX()
- 2014百度校招笔试题之动态链接库&静态链接库详解
- Mac 安装 Crypto.Cipher 模块
- hdoj 4911 Inversion 树状数组+离散化
- christian louboutin paris "Criminal Law" also provides the indecent assault of women and child mole
- 新浪微博(第六天)
- 2416 启动文件
- 字符之谜