题目:
Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: nums = [1,2,3]
Output:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
解答:
解法一:回溯递归
本题与 77 题解法基本一致,也是采用回溯和递归的方法。
这其实是一个深度遍历的过程,比如当 Input为nums = [1,2,3]时,遍历输出的过程是:[]→[1]→[1,2]→[1,2,3]→[1,3]→[2]→[2,3]→[3],其中注意要加入一个空数组。
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> list = new ArrayList<>();
res.add(new ArrayList<>());
Recursive(nums, res, list, 0);
return res;
}
private void Recursive(int[] nums, List<List<Integer>> res, List<Integer> list, int start) {
for(int i=start; i<nums.length; i++) {
list.add(nums[i]);
res.add(new ArrayList<>(list));
Recursive(nums, res, list, i+1);
list.remove(list.size()-1);
}
}
}
解法二:位运算
看到了还有一种采用位运算的解法
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if (nums.length == 0) {
return res;
}
res.add(new ArrayList<>());
//二进制最大的数
int max = (int) Math.pow(2, nums.length);
//每一个进行循环比如是三位也就是1-7循环看看是哪一位二进制七位
for (int i = 1; i < max; i++) {
//为了循环中判断二进制中哪一位是1
int m = 1;
List<Integer> list = new ArrayList<>();
for (int j = 0; j < nums.length; j++) {
if ((i & m) != 0) {
list.add(nums[j]);
}
m = m << 1;
}
res.add(new ArrayList<>(list));
}
return res;
}
}
注意:
Math.pow()
:该方法用于返回第一个参数的第二个参数次方。