LeetCodeブラッシングノート_78。サブセット

トピックはLeetCodeからです

78. 子集

他のソリューションまたはソースコードにアクセスできます:tongji4m3

解説

繰り返し要素のない整数配列numsのセットを指定すると、配列のすべての可能なサブセット(べき集合)を返します。

注:ソリューションセットに重複するサブセットを含めることはできません。

例:

输入: nums = [1,2,3]
输出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

アイデア

解空間ツリーを描画します。これは、解空間ツリーのすべての要素をセットに追加することと同じです(重複セットを削除します)。

boolean [] marked;
recursive(0);

recursive(int height)
{
    
    
    result.add(temp);
    if(height==N) return;
    for i in N
    {
    
    
        if(!marked[i])
        {
    
    
            temp.add(nums[i]);
            marked[i]=true;
            recursive(height+1);
            marked[i]=false;
            temp.remove(nums[i]);          
              
        }
    }
}

細部

  1. 重複セットは削除する必要があるため、部分的な順序付けを直接使用してコードを簡略化できることに注意してください

コード

private List<Integer> temp = new LinkedList<>();
private List<List<Integer>> result = new LinkedList<>();

public List<List<Integer>> subsets(int[] nums)
{
    
    
    recursive(nums,0);
    return result;
}

public void recursive(int[] nums,int start)
{
    
    
    result.add(new LinkedList<>(temp));

    for (int i = start; i < nums.length; i++)
    {
    
    
        temp.add(nums[i]);
        recursive(nums,i+1);
        temp.remove(temp.size()-1);
    }
}
//循环
//本质上就是模拟一个个元素不断加入集合的过程
public List<List<Integer>> subsets(int[] nums)
{
    
    
    List<List<Integer>> result = new LinkedList<>();
    result.add(new LinkedList<>());//刚开始为空集

    for (int i = 0; i < nums.length; i++)
    {
    
    
        //加入元素nums[i]所得到的额外的list
        List<List<Integer>> list = new LinkedList<>();
        for (List<Integer> e : result)//就是通过原本的每个集合都加入该元素
        {
    
    
            List<Integer> temp = new LinkedList<>(e);
            temp.add(nums[i]);
            list.add(temp);
        }
        result.addAll(list);
    }
    return result;
}

複雑さの分析

時間の複雑さ

O(1)O(1) O 1

スペースの複雑さ

O(1)O(1) O 1

おすすめ

転載: blog.csdn.net/weixin_42249196/article/details/108354525