パワーセット。書き込みの一つの方法は、すべてのセットのサブセットを返します。コレクションは重複要素が含まれていません。
説明:ソリューションセットの重複サブセットを含めることはできません。
例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
ソリューション:
思考:バイナリ法
第一の組のパワーセットの数n個の要素のように知っている:N ^ 2
NUMS = [1,2,3]を、長さ3の、NUMS []位置、値フー1ため、フーは0になりません。
例えば:
第一の部分集合0:0 - > [0,0,0]:[]
1サブセット:1 - > [0,0,1]: [NUMS [0]
2つのサブセット:2-> [0,1,0]:[NUMS [1 ]
3つのサブセットの:3 - > [0、1 、1]:[NUMS [0]、NUMS [1]
4つのサブセット:4 - > [ 1、0、0]:[ NUMS [2]
5つのサブセット:5 - > [1、0 、1]:[NUMS [0]、NUMS [2]
6つのサブセット:6 - > [1 、1、0]:[NUMS [1]、NUMS [2]
7サブセット:7 - > [1、1 、1]:[NUMS [0]、NUMS [1]、NUMS [2]
JAVAコード:
class Solution {
public List<List<Integer>> subsets(int[] nums) {
// n个元素的集合,幂集个数为2^n
List<List<Integer>> res = new ArrayList<>();
int n = nums.length;
//i代表第i个集合
for (int i=0; i<(1<<n); i++){
List<Integer> temp = new ArrayList<>();
//j代表Nums[]的位置
for(int j=0; j<n; j++){
if ((i & (1<<j))!=0) {
temp.add(nums[j]);
}
}
res.add(temp);
}
return res;
}
}
思考2:列挙方法
= NUMS [1,2,3]
以下のJavaコード
class Solution {
public List<List<Integer>> subsets1(int[] nums) {
List<List<Integer>> output = new ArrayList<>();
//初始时output中只有一个空的list
output.add(new ArrayList<>());
for (int num: nums){
List<List<Integer>> newSubsets = new ArrayList<>(); //存放每加入一个新元素后新增的子集
//产生新的子集
for (List<Integer> curr1: output) {
newSubsets.add(new ArrayList<Integer>(curr1){{add(num);}}); //这一句不是太懂
}
//将新子集加入到output中
for (List<Integer> curr2: newSubsets)
output.add(curr2);
}
return output;
}
}
思考3:二項ツリー
すべての完全なバイナリのサブセットを構成し、問題が選択されていないと考えられ、左右のサブツリーから選択することができる、それは、それぞれの層が選択され、i番目の要素のために選択されていないことを示しています。だから、限り、あなたは完全なバイナリツリーを走査することができますよう。
JAVAコード:
public static void preOrder(List<List<Integer>> res, List<Integer> subset, int i, int[] nums){
if (i>=nums.length) return;
// 到了新的状态,记录新的路径,要重新拷贝一份
subset = new ArrayList<Integer>(subset);
res.add(subset);
preOrder(res, subset, i+1, nums);
subset.add(nums[i]);
preOrder(res, subset, i+1, nums);
}
アイデア4:バックトラック
JAVAコード:
public static void backtrack(int[] nums, int i, List<Integer> sub, List<List<Integer>> res) {
for (int j = i; j < nums.length; j++) {
sub.add(nums[j]);
res.add(new ArrayList<Integer>(sub));
backtrack(nums, j + 1, sub, res);
sub.remove(sub.size() - 1);
}
}