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
    
  • 相关阅读:
    [USACO09Open] Tower of Hay 干草塔
    [HNOI2004]打鼹鼠
    BZOJ1222[HNOI 2001]产品加工
    BZOJ1270[BJWC2008]雷涛的小猫
    NOIP2018出征策
    解析·NOIP·冷门 CLZ最小环
    CCF-NOIP-2018 提高组(复赛) 模拟试题(九)(2018 CSYZ长沙一中)
    [脚本无敌1]图片批量处理(matlab)
    用Matlab解《2013年数据建模比赛》图像碎片拼接题
    火灾检测-fire,fire
  • 原文地址:https://www.cnblogs.com/sinlearn/p/13085103.html
Copyright © 2011-2022 走看看