• LeetCode#189 Rotate Array


    Problem Definition:

      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?

    Solution 1:最简单粗暴的,每次右移一个坑,移k次。空间复杂度是O(1),然并软,超时。

     1 def rotate(nums, k):
     2     n=len(nums)
     3     if n==0:
     4         return
     5     while k>0:
     6         rear=nums[n-1]
     7         for i in range(n-1,0,-1):
     8             nums[i]=nums[i-1]
     9         nums[0]=rear
    10         k-=1

    Solution 2: 动用一个临时数组来存放数组前面一部分,空间复杂度 O(n-k)。

    1 def rotate(self, nums, k):
    2     n=len(nums)
    3     k=k%n   #一点优化,含n个数的数组,移动n次相当于没移动
    4     nums[:k],nums[k:]=nums[n-k:n],nums[:n-k]

    Solution 3 (硬菜): 不需要临时数组,空间复杂度O(1),三次反转。

      一个栗子: nums=[1,2,3,4,5]  k=2

            [1,2,3,  |  4,5]  --> 

                      [3,2,1  |  4,5]  --> 

                                 [3,2,1  |  5,4]  -->

                                            [4,5,1,2,3]

     1 #辅助函数,将数组nums中下标start到end的子数组反转
     2 def reverse(nums,start,end):
     3     # space O(1)
     4     while start<end:
     5         nums[start],nums[end]=nums[end],nums[start]
     6         start+=1
     7         end-=1
     8 
     9 def rotate(nums, k):
    10     n=len(nums)
    11     k=k%n
    12     reverse(nums,0,n-k-1)
    13     reverse(nums,n-k,n-1)
    14     reverse(nums,0,n-1)
  • 相关阅读:
    Picasso的使用
    利用APT实现Android编译时注解
    Android新增的注解
    Android 最早使用的简单的网络请求
    Java中的Type
    Android IntentService
    Android view状态保存
    Android ANR
    Android 文字垂直居中
    Activity Fragment转场动画
  • 原文地址:https://www.cnblogs.com/acetseng/p/4658747.html
Copyright © 2020-2023  润新知