【旋转数组】题目:
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
进阶:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
示例 1:
输入: nums = [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]
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2skh7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1.0 自己尝试解答
1 class Solution(object): 2 def rotate(self, nums, k): 3 """ 4 :type nums: List[int] 5 :type k: int 6 :rtype: None Do not return anything, modify nums in-place instead. 7 """ 8 if len(nums)<2: 9 return nums 10 while k != 0: 11 j = len(nums)-1 # 控制最后一位数的变量 12 n = nums[j] # 把最后一位数赋值给一个变量储存起来 13 for i in range(j-1, -1, -1): 14 nums[i+1] = nums[i] 15 k = k-1 16 if k == 0: 17 nums[0] = n 18 return nums 19 20 # 没有考虑到循环 21 22 if __name__ == ‘__main__‘: 23 rot = Solution().rotate([1,2,3,4,5,6,7],3) 24 print(rot)
反思:没有考虑到循环
2.0 看了颠倒列表法的思路后自己尝试编写
这道题可以分解为两个问题:
1、取出元素。pop函数
2、添加到头部/尾部。添加到头部比较困难,append添加到尾部比较简单+reverse函数。
1 class Solution(object): 2 def rotate(self, nums, k): 3 """ 4 :type nums: List[int] 5 :type k: int 6 :rtype: None Do not return anything, modify nums in-place instead. 7 """ 8 if len(nums)<2: 9 return nums 10 else: 11 nums.reverse() 12 while k != 0: 13 n = nums.pop(0) 14 nums.append(n) 15 k = k-1 16 if k == 0: 17 nums.reverse() 18 return nums 19 nums.reverse() 20 return nums #超出时间限制 21 if __name__ == ‘__main__‘: 22 rot = Solution().rotate([1,2],0) 23 print(rot)
问题:超出时间限制
原因:
2.1 颠倒列表法
1 class Solution(object): 2 def rotate(self, nums, k): 3 """ 4 :type nums: List[int] 5 :type k: int 6 :rtype: None Do not return anything, modify nums in-place instead. 7 """ 8 if len(nums)<2: 9 return 10 nums.reverse() 11 k = k % len(nums) 12 while k > 0: 13 n = nums.pop(0) 14 nums.append(n) 15 k -= 1 16 nums.reverse() 17 return
问题:超出时间限制
学到的经验:
① k>0 比 k != 0 更为准确
② while下的 if 代码块是不必要的
③ k % l
b > a 时,返回的值还是b,可以用这个特性来判断是否超出范围。能考虑到k的范围问题也是很严谨了。
原文:https://www.cnblogs.com/a-hong/p/15107068.html