Rotate Array
来源:互联网 发布:网络喊麦最火的歌曲 编辑:程序博客网 时间:2024/06/05 09:09
题目描述:
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.
Hint:
Could you do it in-place with O(1) extra space?
题目大意:
将包含n个元素的数组向右旋转k步
例如,数组[1,2,3,4,5,6,7]包含元素个数n = 7,向右旋转k = 3步,得到[5,6,7,1,2,3,4]。
至少有3种不同的解题方法,最好使用O(1)的额外空间,“就地”完成数组旋转。
解题思路及代码:
参考LeetCode Discuss(https://oj.leetcode.com/discuss/26088/two-solution-with-extra-memory-dont-know-the-third-one-yet-idea)
解法一 [ 时间复杂度O(n),空间复杂度O(1) ]:
以n - k为界,分别对数组的左右两边执行一次逆置;然后对整个数组执行逆置。
reverse(nums, 0, n - k - 1)reverse(nums, n - k, n - 1)reverse(nums, 0, n - 1)
Python代码:
class Solution: # @param nums, a list of integer # @param k, num of steps # @return nothing, please modify the nums list in-place. def rotate(self, nums, k): n = len(nums) k %= n self.reverse(nums, 0, n - k) self.reverse(nums, n - k, n) self.reverse(nums, 0, n) def reverse(self, nums, start, end): for x in range(start, (start + end) / 2): nums[x] ^= nums[start + end - x - 1] nums[start + end - x - 1] ^= nums[x] nums[x] ^= nums[start + end - x - 1]
解法二 [ 时间复杂度O(n^2),间复杂度O(1) ]:
将数组元素依次循环向右平移k个单位
c++代码:
/*class Solution {public: void rotate(int nums[], int n, int k) {//方法1:循环右转(类似于循环队列) int temp=0; for(int step=0;step<k;step++) { temp=nums[n-1]; for(int i=n-2;i>=0;i--) { nums[i+1]=nums[i]; } nums[0]=temp; } }};*/
解法三 [ 时间复杂度O(n),空间复杂度O(n) ]:
注:此方法需要构造新的数组,不满足提示描述中的“就地”旋转条件
class Solution: # @param nums, a list of integer # @param k, num of steps # @return nothing, please modify the nums list in-place. def rotate(self, nums, k): n = len(nums) if k > 0 and n > 1: self.nums = nums[n - k:] + nums[:n - k] for x in range(n): nums[x] = self.nums[x];
第四个方法:
- void rotate(int nums[], int n, int k) {
- k = k % n;
- if (k == 0) return;
- int *temp = new int[n];
- memcpy(temp, nums+(n-k), sizeof(int)*k);
- memcpy(temp+k, nums, sizeof(int)*(n-k));
- memcpy(nums, temp, sizeof(int)*n);
- delete[] temp;
- }
0 0
- Rotate Array
- Rotate Array
- Rotate Array
- Rotate Array
- Rotate Array
- Rotate Array
- rotate array
- Rotate Array
- Rotate Array
- Rotate Array
- Rotate Array
- Rotate Array
- Rotate Array
- Rotate Array
- Rotate Array
- Rotate Array
- Rotate Array
- Rotate Array
- [LeetCode 160]Intersection of Two Linked Lists
- log4j.propertiesj配置
- Cocos2d-x下Lua调用自定义C++类和函数的最佳实践
- 运输公司对用户计算运输费用
- 深入理解Android之设备加密Device Encryption
- Rotate Array
- 深入理解Javascript之执行上下文(Execution Context)
- Log4j配置详解之log4j.xml
- [Java初学] 第一次作业 希腊字母表GreekAlphabet.java
- nyoj8 一种排序(sort三级排序)
- HDU 1241 DFS--分块
- 第二章第1题
- thinkPHP笔记----数据库操作
- 细数谷歌浏览器的10大隐藏技能