【初级算法】旋转数组 2021.8.6

【旋转数组】题目:
给定一个数组,将数组中的元素向右移动 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)
Code 1.0

反思:没有考虑到循环

 

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)
Code2.0

问题:超出时间限制

原因:

 

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 
Code2.1

问题:超出时间限制

学到的经验:

① k>0 比 k != 0 更为准确

② while下的 if 代码块是不必要的

③ k % l

  

 

 b > a 时,返回的值还是b,可以用这个特性来判断是否超出范围。能考虑到k的范围问题也是很严谨了。

posted @ 2021-08-06 09:23  阿吽  阅读(28)  评论(0)    收藏  举报