Leetcode78/90/491之回溯中的子集问题
作者:互联网
回溯之子集问题
- 子集问题和组合问题特别像
Leetcode78-子集
- 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)
- 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集
- 输入:nums = [1,2,3]
- 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
dfs(nums, 0);
return res;
}
private void dfs(int[] nums, int begin) {
res.add(new ArrayList<>(path));
for (int i=begin; i<nums.length; i++) {
path.add(nums[i]);
dfs(nums, i+1);
path.remove(path.size()-1);
}
}
Leetcode90-子集二
- 给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)
- 解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列
- 输入:nums = [1,2,2]
- 输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
- 总结:一般有重复元素 如果简单的话都是排序然后判断nums[i]==nums[i-1];复杂的话用hashset(见下一题)
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
dfs(nums, 0);
return res;
}
private void dfs(int[] nums, int begin) {
res.add(new ArrayList<>(path));
for (int i=begin; i<nums.length; i++) {
if(i>0 && i!=begin && nums[i]==nums[i-1]){
continue;
}
path.add(nums[i]);
dfs(nums, i+1);
path.remove(path.size()-1);
}
}
Leetcode491-递增子序列
- 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案
- 数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况
- 输入:nums = [4,6,7,7]
- 输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]
public class L491 {
LinkedList<List<Integer>> res=new LinkedList<>();
LinkedList<Integer> integers=new LinkedList<>();
Set<Integer> set = new HashSet<Integer>();
public List<List<Integer>> findSubsequences(int[] nums) {
find(nums,0);
return res;
}
// public void find(int[] nums,int startIndex){
// if(integers.size()>1){
// if(!res.contains(integers)){//去重
// res.add(new ArrayList<>(integers));
// }
// }
// for(int i=startIndex;i<nums.length;i++){
// if(!integers.isEmpty() && nums[i]<integers.getLast()){
// continue;
// }
// integers.add(nums[i]);
// find(nums,i+1);
// integers.removeLast();
// }
// }
public void find(int[] nums,int startIndex){
if(integers.size()>1){
res.add(new ArrayList<>(integers));
}
Set set=new HashSet<Integer>();//注意在这里new 这样每次深度递归时都是新的set
for(int i=startIndex;i<nums.length;i++){
if(!integers.isEmpty() && nums[i]<integers.getLast() || set.contains(nums[i])){
continue;
}
set.add(nums[i]);
integers.add(nums[i]);
find(nums,i+1);
integers.removeLast();
}
}
public static void main(String[] args) {
int[] test=new int[]{4,6,7,7,7};
L491 l491 = new L491();
List<List<Integer>> subsequences = l491.findSubsequences(test);
for (List<Integer> subsequence : subsequences) {
for (Integer integer : subsequence) {
System.out.print(integer);
}
System.out.println();
}
}
}
标签:nums,int,res,Leetcode78,子集,ArrayList,new,90,491 来源: https://www.cnblogs.com/fao99/p/16111677.html