给定一组不含重复元素的整数数组 nums,返回该数组全部可能的子集(幂集)。数组
说明:解集不能包含重复的子集。网络
示例:code
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]]leetcode
来源:力扣(LeetCode)
连接:https://leetcode-cn.com/problems/subsets
著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。get
2^4==1<<len
。((bitMask >> i) & 1)
能够判断掩码的哪些位为1。故每条掩码对应一个子集。回溯法待作。it
public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> subSetList = new LinkedList<>(); int len = nums.length; int subSetCnt = 1 << len;// 子集数目 for (int bitMask = 0; bitMask < subSetCnt; ++bitMask) { List<Integer> subSet = new LinkedList<>(); for (int i = 0; i < len; ++i) { if (((bitMask >> i) & 1) == 1) { // 若是掩码第(低)i位为1 subSet.add(nums[i]); } } subSetList.add(subSet); } return subSetList; }
public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> subSetList = new LinkedList<>(); int len = nums.length; subSetList.add(new LinkedList<>()); for (int i = 0; i < len; ++i) { int curSubSetCnt = subSetList.size(); for (int j = 0; j < curSubSetCnt; ++j) { // 注意这里用常数curSubSetCnt,保证只遍历列表未加入这个元素以前的全部子集 List<Integer> newSebSet = new LinkedList<>(subSetList.get(j)); newSebSet.add(nums[i]); subSetList.add(newSebSet); } } return subSetList; }