博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(python版) Leetcode-189. 旋转数组
阅读量:4092 次
发布时间:2019-05-25

本文共 1610 字,大约阅读时间需要 5 分钟。

01 题目

给定一个数组,将数组中的元素向右移动 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]

说明:

  • 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
  • 要求使用空间复杂度为 O(1) 的 原地 算法。

链接:https://leetcode-cn.com/problems/rotate-array

02 解析

三次反转

对于[1,2,3,4,5,6,7],

根据k=k%n,将数组分为两段:

第一段,对应数组下标范围[0, n-k-1]段,即[1,2,3,4]

第二段,对应数组下标范围[n-k, n-1],即[5,6,7]

分为三步:

  • 反转整体,[7,6,5,4,3,2,1]
  • 反转第一段,[5,6,7,4,3,2,1]
  • 反转第二段,[5,6,7,1,2,3,4]

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

链接:https://leetcode-cn.com/problems/rotate-array/solution/san-ci-fan-zhuan-fu-yi-xie-pythonicde-jie-fa-pytho/

03 代码

解法1

class Solution:    def rotate(self, nums: List[int], k: int) -> None:        """        Do not return anything, modify nums in-place instead.        """        n=len(nums)        k=k%n        def swap(l,r):            while(l

在这里插入图片描述

解法2 【最优】

另外一种写法,借助python的切片完成反转。

class Solution:    def rotate(self, nums: List[int], k: int) -> None:        """        Do not return anything, modify nums in-place instead.        """        n = len(nums)        k %= n        nums[:] = nums[::-1]		# 反转整体        nums[:k] = nums[:k][::-1]	# 反转第一段        nums[k:] = nums[k:][::-1]	# 反转第二段

在这里插入图片描述

解法3

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

在这里插入图片描述

解法4

class Solution:    def rotate(self, nums: List[int], k: int) -> None:        n = len(nums)        k %= n        for _ in range(k):            nums.insert(0, nums.pop())

在这里插入图片描述

转载地址:http://hujii.baihongyu.com/

你可能感兴趣的文章
【vue】render 函数如何在iview的表格中循环渲染
查看>>
vue 实现12个月的平铺式日历插件
查看>>
【iview 避坑记录】iview的switch组件使用字符串控制开关
查看>>
BFC 的原理浅析
查看>>
vue 中后台管理系统的权限管理实现逻辑记录
查看>>
JS中document对象和window对象有什么区别
查看>>
vue-draggable 实现拖拽效果的使用方法
查看>>
在 vue 中使用 echarts 的详细步骤
查看>>
前端干货|两种方式给数字加上千分位分隔符
查看>>
没事聊聊本地存储-web storage
查看>>
本地缓存与浏览器缓存的区别
查看>>
什么是防抖、节流?怎么实现它们?
查看>>
前端常见经典布局一:粘连布局
查看>>
CommonJS Browserify模块化教程
查看>>
AMD:RequireJS模块化教程
查看>>
CMD:SeaJS模块化教程
查看>>
ES6模块化教程
查看>>
前端模块化知识汇总
查看>>
mockjs使用指南
查看>>
移动端如何实现头部底部固定,中间区域自适应
查看>>