难度: medium
给你一个整数数组 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 中的所有元素 互不相同
解题思路:有递归解法和非递归解法,非递归解法就是在一个二维数组里面,在已添加的一维数组都添加一个当前遍历到的nums[i],然后再继续添加到res的尾部,也就是这样的一个增长过程,以nums = [1,2,3]为例:[[]], [[], [1]], [[], [1], [2], [1, 2]]。这是三个月前提交的cpp解法。
代码 t49 s26 java
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> res(1);
for(int i=0; i<nums.size(); i++){
int sz = res.size();
for(int j=0; j<sz; j++){
res.push_back(res[j]);
res.back().push_back(nums[i]);
}
}
return res;
}
};
还有今天提交的java解法
代码 t82 s24 java
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
int len = nums.length;
if(len==0) return res;
res.add(new ArrayList<>());
for(int i=0; i<len; i++){
int sz = res.size();
for(int j=0; j<sz; j++){
List<Integer> temp = new ArrayList(res.get(j));
temp.add(nums[i]);
res.add(temp);
}
}
return res;
}
}
解题思路:下面这个解法是递归的写法,也是来自grandyang
代码 t100 s30 cpp
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
vector<int> out;
helper(res, out, nums, 0);
return res;
}
void helper(vector<vector<int>>& res, vector<int>& out, vector<int>& nums, int pos){
res.push_back(out);
for(int i=pos; i<nums.size(); i++){
out.push_back(nums[i]);
helper(res, out, nums, i+1);
out.pop_back();
}
}
};
java递归解法没写出来,后面补上吧。
参考资料:
https://www.cnblogs.com/grandyang/p/4309345.html
原文:https://www.cnblogs.com/zhengxch/p/14600949.html