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.

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];第四个方法:

  
  
  1. void rotate(int nums[], int n, int k) {  
  2.     k = k % n;  
  3.     if (k == 0) return;  
  4.     int *temp = new int[n];  
  5.     memcpy(temp, nums+(n-k), sizeof(int)*k);  
  6.     memcpy(temp+k, nums, sizeof(int)*(n-k));  
  7.     memcpy(nums, temp, sizeof(int)*n);  
  8.     delete[] temp;  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值