回溯法的理解:
先从选择列表中进行选择,然后进行回溯(递归),之后撤销当前的选择。
回溯法主要包括以下两个变量:
- 选择列表
- 决策路径
回溯法的框架:
result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
对于本题,除了应用回溯法进行查找,还要对选择过的元素进行标记,不再进行选择,避免重复。
其中,nums[:i] + nums[i+1:]就实现了从nums中删除已经选择的元素。
本题的代码:
class Solution:
def permute(self, nums):
result = []
nums_length = len(nums)
def backtrack(nums, answer = []):
if len(answer) == nums_length:
result.append(answer)
for i in range(len(nums)):
backtrack(nums[:i] + nums[i+1:],answer + [nums[i]])
backtrack(nums,[])
return result
大佬的代码:
思路是一样的,就睡代码写法略有不同。
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
参考链接:
https://zhuanlan.zhihu.com/p/53356027
来源:CSDN
作者:chenyy__
链接:https://blog.csdn.net/cy_believ/article/details/104214911