3.30-Leetcode刷题
Array
46题 中等
https://leetcode-cn.com/problems/permutations/
遍历nums,新建res保存生成后的List,递归调用back()进行回溯,遍历当前位置之后的数,对其前后的元素进行切片,返回给res
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
#nums为List类型,数据类型int,res[]保存生成List
res=[]
#定义函数进行回溯遍历
def back(nums,tmp):
if not nums: #如果nums为空,里面的数就加入res中,递归结束的条件!
res.append(tmp)
return
for i in range(len(nums)): #遍历nums进行切片,递归调用
back(nums[:i]+nums[i+1:],tmp+[num[i]]) #i位置为当前遍历的数据位置
back(nums,[]) #调用函数
return res
47题 中等
https://leetcode-cn.com/problems/permutations-ii/
同46思路类似,剪枝+回溯,但是!增加一个List排序,从小到大排序,可以看出重复元素
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
nums.sort() #对List元素进行排序
res=[] #存放结果List
def recur(nums,tmp): #回溯+剪枝
if not nums: #递归结束条件,nums
res.append(tmp)
return
for i in range(len(nums)): #遍历List,防止构造重复结果
if i>0 and nums[i]==nums[i-1]:
continue
recur(nums[:i]+nums[i+1:],tmp+nums[i]) #切片,拼出新List
recur(nums,[]) #调用回溯函数
return res