题目来源于leetcode,解法和思路仅代表个人观点。传送门。
难度:中等
用时:9min(难得一遍过(测试的时候))
题目
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
思想
方法一:回溯中,子集树的思想
方法二:枚举0~2^(n-1)中状态,每一种状态对应一个解
方法二:
举一个官方的例子,
每个一个数字中,它的每一位表示该位上的数【取】还是【不取】。0表示不取,1表示取。
代码
class Solution {
public List<List<Integer>> subsets(int[] nums) {
int cnt = (int) Math.pow(2,nums.length);
List<List<Integer>> ans = new ArrayList<>();
//枚举cnt
for(int i=0;i<cnt;i++){
List<Integer> result = getSet(nums,i);
ans.add(result);
}
return ans;
}
public List<Integer> getSet(int[] nums,int mask){
List<Integer> result = new ArrayList<>();
int radix = 1;
for(int i=0;i<nums.length;i++){
radix = (int)Math.pow(2,i);
if((mask & radix) != 0){
result.add(nums[i]);
}
}
return result;
}
}
算法复杂度
时间复杂度: O(n×2n)。一共 2n个状态,每种状态需要 O(n)的时间来构造子集。
空间复杂度: O(n)。即构造子集使用的getSet中result_list的空间代价。