78. 子集https://leetcode.cn/problems/subsets/
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
class Solution {
List<List<Integer>> ans = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
backtracking(nums,0);
return ans;
}
private void backtracking(int[] nums,int start){
///收集⼦集,要放在终⽌添加的上⾯,否则会漏掉⾃⼰
ans.add(new ArrayList<>(path));
if(start==nums.length){
return;
}
for(int i=start;i<nums.length;i++){
path.add(nums[i]);
backtracking(nums,i+1);
path.remove(path.size()-1);
}
}
}
491. 递增子序列https://leetcode.cn/problems/non-decreasing-subsequences/
给你一个整数数组 nums
,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。
数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。
示例 1:
输入: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]]
示例 2:
输入:nums = [4,4,3,2,1]
输出:[[4,4]]
class Solution {
List<List<Integer>> ans=new ArrayList<>();
List<Integer> path =new ArrayList<>();
public List<List<Integer>> findSubsequences(int[] nums) {
backtracking(nums,0);
return ans;
}
private void backtracking(int[] nums,int start){
if(path.size()>=2){
// 注意这⾥不要加return,要取树上的节点
ans.add(new ArrayList<>(path));
}
Set<Integer> set=new HashSet<>();
for(int i=start;i<nums.length;i++){
// 如果上一个加入子集的数比当前准备加入的数大则跳过
if(path.size()!=0&&nums[i] < path.get(path.size()-1)){
continue;
}
// 去重:如果父节点下面有2个一样的可能性则跳过后面的重复的子节点选择
if(!set.add(nums[i])){
continue;
}
path.add(nums[i]);
backtracking(nums,i+1);
path.remove(path.size()-1);
}
}
}