491.递增子序列
#伪代码
树层上做去重 树枝上不做去重
在节点上收获结果
path 一维
result 二维
void backtracking(nums,startindex):
if(path.size()>1):result.push_back(path)
unorderset<int> uset;
for(i=startindex;i<nums.size;i++){
if(!path.empty() and nums[i]<path.back() and uset.find(nums[i]!=uset.end())):continue\
uset.inserrt(nums[i]);
path.psuh_back(nums[i]);
backtracking(nums,i+1)
path.pop()
#这里uset每一层都重新定义 只用来记录这一层使用过的数组
}
#自己写出来的代码 就是效率有点低
class Solution:
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
self.path=[]
result=[]
used=[0]*len(nums)
def backtracking(nums,startindex):
if(len(self.path[:]))>=2 and self.path[:] not in result:
result.append(self.path[:])
for i in range(startindex,len(nums)):
# if(i>startindex and nums[i]==nums[i-1] and used[i-1]==0):
# continue
if(self.path and nums[i]<self.path[-1]):
continue
self.path.append(nums[i])
# use[i]=1
backtracking(nums,i+1)
self.path.pop()
# used=0
backtracking(nums,0)
return result
class Solution:
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
self.path=[]
result=[]
def backtracking(nums,startindex):
used=[]
if(len(self.path[:]))>=2:
result.append(self.path[:])
for i in range(startindex,len(nums)):
if(self.path and nums[i]<self.path[-1] or nums[i] in used):
continue
self.path.append(nums[i])
used.append(nums[i])
# use[i]=1
backtracking(nums,i+1)
self.path.pop()
# used=0
backtracking(nums,0)
return result
46.全排列
#伪代码
path 一维
result 二维
void backtracking(nums,used){
if(path.size()==nums.size()):
result.push_back(path);
return;
for(i=0;i<nums.szie();i++){
if(used[i]==True)
continue;
used[i]=True;
path.push_back(nums[i]);
backtracking(nums,used);
used[i]=false;
path.pop_back();}
}
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
path=[]
result=[]
used=[0]*len(nums)
def backtracking(nums,used):
if(len(path[:])==len(nums)):
result.append(path[:])
return
for i in range(len(nums)):
if(used[i]==1):
continue
used[i]=1
path.append(nums[i])
backtracking(nums,used)
used[i]=0
path.pop()
backtracking(nums,used)
return result
47.全排列 II
#伪代码
数层去重
使用used数组 结果在叶子节点上
path 一维
result 二维
void backtracking(nums,used){
if(path.size==nums.size){
result.push.back(path)};
for(i=0;i<nums.size;i++){
if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false):
continue;
if(used[i]==true):
continue;
used[i]=True
path.push.back(nums[i])
backtracking(nums,used);
used[i]=false;
push.pop.back();
}
}
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
path=[]
result=[]
nums.sort()
used=[0]*len(nums)
def backtracking(nums,used):
if(len(path)==len(nums)):
result.append(path[:])
return
for i in range(len(nums)):
if(i>0 and nums[i]==nums[i-1] and used[i-1]==0):
continue
if(used[i]==1):
continue
used[i]=1
path.append(nums[i])
backtracking(nums,used)
used[i]=0
path.pop()
backtracking(nums,used)
return result