写在前面
关注较早的读者可能知道现阶段的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个数字反转,最后把整个数组再翻转一遍就是结果。第三种将最后一位赋值给中间变量,然后将前一位赋值给后一位,依次类推,效率极低,耗时比较长。
代码实现
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]#切割成两块重新组合
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)
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);
小伙伴们还有没有其他更好的方式呢?欢迎在留言区交流