难度中等978
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0] 输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums
中的所有元素 互不相同
通过次数192,769提交次数242,531
使用二进制进行枚举:
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
for (int i = 0; i < (1 << nums.length); i++) {
//左移一位,来枚举所有情况
//用二进制来表示所有情况 如:[1,2] 对应3的二进制情况 [0,0],[0,1],[1,0],[1,1]
//所以为[] [1] [2] [1,2],对应每个1的位置
List<Integer> sub = new ArrayList<Integer>();
for (int j = 0; j < nums.length; j++)
//右移动j位,再 与1 判断当前位置是否添加。ps:与1是判断奇偶的方法(最低位是否为1)
if (((i >> j) & 1) == 1) sub.add(nums[j]);
res.add(sub);
}
return res;
}
}
迭代:
思路:以1,2,3为例
1:[]
2:[] [1] 对第2轮的列表添加元素1
3:[] [1] [2] [1,2] 对第2轮的列表添加元素2
4:[] [1] [2] [1,2] [3] [1,3] [2,3] [1,2,3] 对第2轮的列表添加元素3
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
res.add(new ArrayList<>());
for (int i = 0; i < nums.length; i++) {
int all = res.size();
for (int j = 0; j < all; j++) {
List<Integer> tmp = new ArrayList<>(res.get(j));
tmp.add(nums[i]);
res.add(tmp);
}
}
return res;
}
}
思路2:递归
从前往后不断添加
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
List<List<Integer>> res_list=new ArrayList<>();
public void func(int k,List<Integer> list,int nums[]){
res_list.add(list);
for(int i=k;i<nums.length;i++){
//做广度遍历,每次把当前和能选择的值进行拼接
list.add(nums[i]);
//浅拷贝,
func(i+1,new ArrayList<>(list) ,nums);
//添加然后移除保证当前的list不变
list.remove(list.size()-1);
}
}
public List<List<Integer>> subsets(int[] nums) {
func(0, new ArrayList<>(), nums);
return res_list;
}
}
思路3:参考满二叉树,对每个元素有两种状态选或者不选。
class Solution {
List<List<Integer>> res_list=new ArrayList<>();
public void func(int i,List<Integer> list,int []nums){
if(i==nums.length){
res_list.add(list);
return;
}
//不添加当前值
func(i+1, list, nums);
//添加当前值
List<Integer> sub_list =new ArrayList<>(list);
sub_list.add(nums[i]);
func(i+1, sub_list,nums);
}
public List<List<Integer>> subsets(int[] nums) {
func(0, new ArrayList<>(), nums);
return res_list;
}
}