491.递增子序列
class Solution {
List<Integer> path =new ArrayList();
List<List<Integer>> result = new ArrayList();
public List<List<Integer>> findSubsequences(int[] nums) {
backtrace(nums,0);
return result;
}
public void backtrace(int[] nums,int startIndex){
if(path.size() > 1){
result.add(new ArrayList(path));
}
if(startIndex == nums.length) return ;
//记录每层的用过的数
Set<Integer> hs = new HashSet<>();
for(int i = startIndex;i<nums.length;i++){
if(path.size()>0 && nums[i] < path.get(path.size()-1) || hs.contains(nums[i]))
continue;
path.add(nums[i]);
hs.add(nums[i]);
backtrace(nums,i+1);
path.removeLast();
}
}
}
46.全排列
class Solution {
List<List<Integer>> result = new ArrayList();
List<Integer> path = new ArrayList();
boolean[] used = null;
public List<List<Integer>> permute(int[] nums) {
backTrace(nums,used);
return result;
}
public void backTrace(int[] nums,boolean[] used){
if(path.size() == nums.length){
result.add(new ArrayList(path));
return;
}
for(int i = 0;i<nums.length;i++){
//是否使用过的元素
if(path.contains(nums[i])) continue;
path.add(nums[i]);
backTrace(nums,used);
path.removeLast();
}
}
}
47.全排列 II
class Solution {
List<List<Integer>> result = new ArrayList();
List<Integer> path = new ArrayList();
boolean[] used = null;
public List<List<Integer>> permuteUnique(int[] nums) {
used = new boolean[nums.length];
Arrays.sort(nums);
Arrays.fill(used,false);
backTrace(nums,used);
return result;
}
public void backTrace(int[] nums,boolean[] used){
if(path.size() == nums.length){
result.add(new ArrayList(path));
return ;
}
for(int i = 0;i<nums.length;i++){
//数层去重重复的元素不使用
if(i>0 && nums[i] == nums[i-1] && used[i-1] == false ) continue;
//同一层已经使用过的元素不使用
if(used[i] == true) continue;
used[i] = true;
path.add(nums[i]);
backTrace(nums,used);
path.removeLast();
used[i] = false;
}
}
}