方法一(44ms):
参照剑指offer(38)中的方法,把第一个数值依次和后面的交换,并把第一个数值固定,后面的数字进行递归。
改进点:其中是从第一位和第一位开始的,所以当i==left的时候,需要做交换操作,可以节约一些时间
class Solution(object):
def permute(self, nums):
if nums==[]: return [[]]
outcome=[]
self.core(nums,0,outcome)
return outcome
def core(self,nums,left,outcome):
if left==len(nums)-1:
outcome.append(nums[:])
return
else:
for i in range(left,len(nums)):
if i==left:
self.core(nums,left+1,outcome)
else:
nums[left],nums[i]=nums[i],nums[left]
self.core(nums,left+1,outcome)
nums[left],nums[i]=nums[i],nums[left]
方法二(40ms)回溯法
使用一个和nums长度一样的数列,记录是否使用到这个元素,使用到以后把这个数列对应的位置改为True
class Solution(object):
def permute(self, nums):
mark=[False]*len(nums)
outcome=[]
curr=[]
self.core(mark,nums,curr,outcome)
return outcome
def core(self,mark,nums,curr,outcome):
if sum(mark)==len(nums):
outcome.append(curr[:])
for i in range(len(nums)):
if mark[i]:
continue
curr.append(nums[i])
mark[i]=True
self.core(mark,nums,curr,outcome)
mark[i]=False
curr.pop()