首页 > 编程语言 > 详细

【初级算法】旋转数组 2021.8.6

时间:2021-08-06 10:43:10      阅读:34      评论:0      收藏:0      [点我收藏+]

【旋转数组】题目:
给定一个数组,将数组中的元素向右移动 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的范围问题也是很严谨了。

【初级算法】旋转数组 2021.8.6

原文:https://www.cnblogs.com/a-hong/p/15107068.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!