LeetCode-078-子集
思路
法一:迭代法,遍历数组逐个加入元素,如1,2,3
第一轮循环:size=1,[ ]:[ ] [1]
第二轮循环:size=2,[ ] [1]:[ ] [1] [2] [1,2]
第三轮循环:size=4,[ ] [1] [2] [1,2]:[ ] [1] [2] [1,2] [3] [1,3] [2,3] [1,2,3]
法二:回溯法
代码
//迭代法
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> ans=new ArrayList<>();
ans.add(new ArrayList<Integer>());
for(int num:nums){
int n=ans.size();
for(int i=0;i<n;i++){
List<Integer> tmp=new ArrayList<>(ans.get(i));
tmp.add(num);
ans.add(tmp);
}
}
return ans;
}
}
//回溯法
class Solution {
List<List<Integer>> ans=new ArrayList<>();
List<Integer> cur=new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
if(nums==null||nums.length==0){
ans.add(new ArrayList<Integer>());
return ans;
}
backTrack(nums,0);
return ans;
}
public void backTrack(int []nums,int idx){
ans.add(new ArrayList<Integer>(cur));
if(idx>=nums.length) return;
for(int i=idx;i<nums.length;i++){
cur.add(nums[i]);
backTrack(nums,i+1);
cur.remove(cur.size()-1);
}
}
}