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]
说明:

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

答案

解法一

  • 旋转长度,通过取余避免重复操作
  • 从尾部向前开始替换,直接替换为最终值,记录尾部初始值,给数组头部使用
  • ranges通过第三个参数设为-1实现逆序
    注意:第二个参数要取-1才能遍历完一次数组
class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        nums_len = len(nums)
        
        circle_time = k % nums_len
        if circle_time == 0:
            return nums
        
        heads = nums[nums_len - circle_time:]
        for i in range(nums_len - 1, -1, -1):
            new_index = i - circle_time
            if new_index >=0:
                nums[i] = nums[new_index]
            else:
                nums[i] = heads[new_index]

解法二

nums[:]为何写成nums就不行?
应该是不用切片就没有修改原nums地址的值

class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        nums_len = len(nums)
        nums[:] = nums[nums_len-k:] + nums[:nums_len-k]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容