leetcode配列 - パワーセット

パワーセット。書き込みの一つの方法は、すべてのセットのサブセットを返します。コレクションは重複要素が含まれていません。
説明:ソリューションセットの重複サブセットを含めることはできません。

例:

 输入: 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);
        }
    }
リリース9件のオリジナルの記事 ウォンの賞賛0 ビュー257

おすすめ

転載: blog.csdn.net/powerful_ren/article/details/104616594