78题目
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
暴力扩展法处理
import java.util.ArrayList;
import java.util.List;
//暴力扩展法
/*
思想: 先加入空集,在该集合的基础上加入下一个元素,数组[1,2,3]
1、先加入[] 结果集={[]},
2、再加入1,结果集={[],[1]} //空集的基础上加入1
3、再加入2,结果集={[],[1],[2],[1,2]} //{[],[1]}的基础上加入2
4、再加入3,结果集={[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]} //同理
*/
public class subsets_78_0 {
public List<List<Integer>> subsets(int[] nums){
//创建一个可以存储List的空集(result)
List<List<Integer>> result = new ArrayList<List<Integer>>();
//创建一个List的空集传入result。因为空集是所有集合的子集,因此无论数组中有没有值都会包括空集
result.add(new ArrayList<>());
//迭代器遍历每一个元素并加入已存在的集合中
for (int num : nums) {
int resLen = result.size();
for (int i = 0; i < resLen; i++){
List<Integer> cur = new ArrayList<>(result.get(i));
cur.add(num);
result.add(cur);
}
}
return result;
}
public static void main(String[] args) {
int[] arr = {
1, 2, 3};
subsets_78_0 s0 = new subsets_78_0();
System.out.println(s0.subsets(arr));
}
}
backtracking算法处理
import java.util.ArrayList;
import java.util.List;
//backtracking
/*
* 算法思想:按照数组的长度依次处理问题。
* 1、当长度为0时直接返回一个空集合加入到结果集中,
* 2、当长度为1时依次遍历加入当结果集当中,
* 3、需要注意的是在backtracking中一次for循环结束后要保证每次cur子集为空子集(因为在边界处理时[if中]
* 当前cur已经加入到了res结果集当中),避免
* 4、当长度为2时依次添加两个元素加入res结果集当中,同理保证bt中每次for循环结束一次后的cur为空
* 5、长度为n时同理
* */
public class subsets_78_1 {
public List<List<Integer>> subSets(int[] nums