zoukankan      html  css  js  c++  java
  • LeetCode刷题--数组旋转

    题目

    旋转数组:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

    示例 1:
    输入: [1,2,3,4,5,6,7] 和 k = 3
    输出: [5,6,7,1,2,3,4]
    解释:
    向右旋转 1 步: [7,1,2,3,4,5,6]
    向右旋转 2 步: [6,7,1,2,3,4,5]
    向右旋转 3 步: [5,6,7,1,2,3,4]
    
    示例 2:
    输入: [-1,-100,3,99] 和 k = 2
    输出: [3,99,-1,-100]
    解释: 
    向右旋转 1 步: [99,-1,-100,3]
    向右旋转 2 步: [3,99,-1,-100]
    

    解题思路

      从python的角度考虑的话,本题考查的就是列表索引的问题,设定了数组旋转长度也就确定了旋转的位置(len(nums)-k),将nums[:len(nums)-k] 与 nums[len(nums)-k:]的数据互换就行。
    

    代码

    循环遍历

    该种方法在jupyter上能通过,在leetcode平台上,时间未通过,说明还有更好的解法

    class Solution:
        def rotate(self, nums: List[int], k: int) -> None:
            n = len(nums)
            for i in range(k):
                t = nums[-1]
                for j in range(n-1,0, -1):
                    nums[j] = nums[j-1]
                nums[0] = t
    

    切片

    该方法在leetcode上面通过了,但是执行用时:968 ms;内存消耗:13.9 MB;尴尬,去看了看人家写的一行代码解决,鸡血看来的打起啊。

    class Solution:
        def rotate(self, nums: List[int], k: int) -> None:
            for i in range(k):
                t = nums[-1]
                nums[1:] = nums[0:-1]
                nums[0] = t
    

    一次切片

    class Solution:
        def rotate(self, nums: List[int], k: int) -> None:
           nums[:] = nums[len(nums)-k:] + nums[:len(nums)-k]  
    

    测试

    执行用时:32 ms
    内存消耗:13.9 MB
    
  • 相关阅读:
    centos8.0 安装 jenkins
    No match for argument: mysql-community-server Error: Unable to find a match: mysql-community-server
    Navicat 远程连接 centos8.0
    centos8.0 安装 mysql
    -bash: java-version: command not found
    centos8.0 安装 JDK1.8
    [Err] 1062
    android之Fragment基础详解(一)
    Android之RecyclerView(一)
    Android之ProgressBar
  • 原文地址:https://www.cnblogs.com/sinlearn/p/13085103.html
Copyright © 2011-2022 走看看