# coding=utf-8
__author__ = 'Jeff.xie'
"""
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
n = len(nums)
if n<=1: return [nums]
def dfs(p, residual_nums):
#1. 判断当前path长度==3时,可以添加进res里
if len(p)==n:
res.append(p)
return
elif len(p)>n: return
#2. 每次把当前数组中的节点做一遍插入path操作
for j in residual_nums:
#list.copy操作要注意,就是再函数里面不要直接再函数输入变量上做赋值
pa = p.copy()
pa.append(j)
temp = residual_nums.copy()
temp.remove(j)
dfs(pa, temp)
path = []
res = []
#搜索回溯法
dfs(path, nums)
return res
"""
# 思路介绍:使用递归对每一个位置进行遍历,以当前示例为例:刚开始我们的nums_all为[1,2,3],
# 而temp为[],我们第一次使用back函数时进入for循环会分别执行back([2,3],[1]),
# back([1,3],[2])和back([1,2],[3]),之后分为三个分支再继续进行back函数的递归调用,
# 直到back函数的第一个位置为空,则将得到的该结果添加到res中以便最后输出
def t(nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res = [] #存放排列好的list
def back(nums_all,temp): #temp为从list单独提取出来的一个字符,而剩余的其他字符存储在nums_all
if len(nums_all) == 0:
res.append(temp) #nums_all长度为0,说明temp的长度已经达到最大值,所有可以存放到res
return
for i in range(len(nums_all)):
print("res",res)
print("temp",temp)
print("[nums_all[i]]",[nums_all[i]])
# list不要包含自己本身,
back(nums_all[:i]+nums_all[i+1:],temp+[nums_all[i]])
t = []
back(nums,t) #第一次调用
return res
def t1(li):
res=[]#存放结果
def back(nums,temp):
if len(nums)==0: # 当nums的长度为0时,说明回调函数把所有的参数都存到temp中了
res.append(temp)
return
for i in range(len(nums)):#依次提取一个参数,并把其他剩余的参数存到other_nums
other_nums=nums[:i]+nums[i+1:]
#由于是递归提取一个参数,所有需要把上一次提取出来的temp也要添加temp中,nums[i]并且需要list化,需要加中括号,这是两个list相加
back(other_nums,temp+[nums[i]])
t=[]
back(li,t) #第一次调用,temp就是为空list
return res
def t2(li):
r=[]
def back(nums,temp):
if len(nums)==0:
r.append(temp)
return
for i in range(len(nums)):
other= nums[:i]+nums[i+1:]
back(other,temp+[nums[i]])
back(li,[])
return r
def t3(li):
r=[]
def back(nums,temp):
if len(nums)==0:
r.append(temp)
return
for i in range(len(nums)):
other = nums[:i]+nums[i+1:]
back(other,temp+[(nums[i])])
back(li,[])
return r
def t4(li):
r=[]
def back(nums,temp):
if len(nums)==0:
r.append(temp)
return
for i in range(len(nums)):
other = nums[:i]+nums[i+1:]
back(other,temp+[nums[i]])
back(li,[])
return r
if __name__ == '__main__':
li =[1,2,3]
print(li[:0]) #结果为[]
print(li[1:]) #结果为[2, 3]
r = t3(li)
print(r)
r1 = t4(li)
print(r1)
print(len(r1))
执行结果如下:
[]
[2, 3]
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
6