连跨平安夜和圣诞节的考试,终于结束了
也算是松了一口气
平安夜那天考算法算是很喜剧了
之前还是有些慌
想着怎么快捷抄别人的,哈哈哈哈哈
到了考试才发现
手机永远是我们人类最好的朋友
哈哈哈哈哈哈哈
当时考试的题目老师是用PPT展示出来的
当时下面的我们齐刷刷的掏出手机拍照,然后自行百度
这画面也是难得一遇了
只可惜当时没想到给拍下来
大家可以自行脑补
考完了试,今天上午在整理文档
晚上就想着给笔友们更新了
快怒夸我(嘚瑟的表情)
46-全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路:
这一题如果是用python写的话,有一种作弊的算法,就是可以直接用itertools.permutations()函数来求解,大家可以百度,这个函数是专门求给定序列的全排列的,极其方便。我用这种方法run了几遍,发现效果那也真的是没话说,执行效率在99%左右。
代码如下:
import itertools
class Solution:
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums_permutations = itertools.permutations(nums)
final_list = []
for index in nums_permutations:
final_list.append(list(index))
return final_list
if __name__ == "__main__":
nums = [1, 2, 3]
result = Solution().permute(nums)
print(result)
执行效率如下:
如果是只用这种方法的话,那各位笔友肯定会破口大骂:这SB作者,技术不咋地,偷懒倒是一把好手,浪费劳资这么长时间看这些没营养的东西,更有甚者估计把我祖宗都问候了好几遍(哈哈哈哈哈)所以为了不给大家这么直接的机会,我又拍脑袋瓜想到了一种巧妙的算法。
其实这题的核心思想还是回溯法,还是老广告,对于回溯法不是特别熟悉的朋友可以先看看我之前专门总结的一篇关于回溯法的文章。
程小新同学:LeetCode--回溯法心得zhuanlan.zhihu.com
在这儿再多嘴几句,可能是一直在接触回溯法的题目,越用越发现它的神奇。因为你会发现:这种算法的核心思想就是参考我们大脑思考问题的方式而来的,下面这张图是我举的一个例子并附上了它的解题流程,方便大家理解。
大家可以看到:回溯法其实也可以看成是不断剪枝的过程,比如这一题:答案是要三个数的组合,你的判断条件肯定是:前几个数之和为你给的target。如果说你发现找到的前两个数之和就已经大于这个target了,那这两个数之后的情况你就可以不用遍历了,直接找位于第二个数同一层的下一个数(你可以理解为第二个数的相邻兄弟节点),直到找出答案,和我们解决问题的方式真的是一模一样了,所以大家可以好好学习。
言归正传,回到这题。其实思路就和我上面举得那题一样,大家可以参考下图:
代码如下:
class Solution:
# 应该可以用回溯法
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
# 定义保存最后结果的列表集合
final_answer = []
nums_length = len(nums)
def back(answer=[]):
# 如果临时结果集中的元素和给定数组nums长度相等,说明拿到了结果
if len(answer) == nums_length:
final_answer.append(answer)
return
for index in nums:
if index not in answer:
back(answer+[index])
back()
return final_answer
if __name__ == "__main__":
nums = [1, 2, 3]
result = Solution().permute(nums)
print(result)
执行效率也是不错的,在90%以上。