前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【LeetCode】数组--旋转数组(189)

【LeetCode】数组--旋转数组(189)

作者头像
PM小王
发布2019-07-02 16:43:18
4230
发布2019-07-02 16:43:18
举报
文章被收录于专栏:程序员小王程序员小王

写在前面

关注较早的读者可能知道现阶段的LeetCode刷题将按照某一个特定的专题进行,之前的【贪心算法】已经结束,虽然只有三个题却包含了简单,中等,困难这三个维度,今天介绍的是第二个专题【数组】

数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。在每一种编程语言中,基本都会有数组这种数据类型。不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构。

贪心算法回顾:

【LeetCode】贪心算法--买卖股票的最佳时机II(122)

【LeetCode】贪心算法--划分字母区间(763)

【LeetCode】贪心算法--分发糖果(135)

前文回顾:

【LeetCode】数组--合并区间(56)

刷题汇总:

【LeetCode】汇总贴(NO.1-20)

今日题目

给定一个数组,将数组中的元素向右移动 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) 的原地算法。

题目分析

题目比较简单,简单说一下自己的思路。要求至少有三种不同的方法解决这个问题,最先想到使用数组切片的方式,仅仅两行代码,很简洁,同时也是原地算法,代码中已经添加注释。第二种方法则是利用内置反转函数reversed(),把前面l-k个数字反转,后面k个数字反转,最后把整个数组再翻转一遍就是结果。第三种将最后一位赋值给中间变量,然后将前一位赋值给后一位,依次类推,效率极低,耗时比较长。

代码实现

代码语言:javascript
复制
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        """ 第一种数组切片"""
        l = len(nums) #保证循环次数在0-len(nums)之间
        nums[:] = nums[l-k:] + nums[:l-k]#切割成两块重新组合
代码语言:javascript
复制
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        """第二种使用内置函数"""
        l = len(nums)
        nums[:l-k] = reversed(nums[:l-k])
        nums[l-k:] = reversed(nums[l-k:])
        nums[:] = reversed(nums)
代码语言:javascript
复制
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
       """第三种利用中间变量"""
        i = 1;
        while i <= k :
            l = nums[len(nums) - 1];
            for j in range(0,len(nums)-1):
                nums[len(nums) - j - 1] = nums[len(nums) - j - 2];

            nums[0] = l;
            i = i + 1;

        print(nums);

小伙伴们还有没有其他更好的方式呢?欢迎在留言区交流

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小王 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档