トピックはLeetCodeからです
他のソリューションまたはソースコードにアクセスできます: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]);
}
}
}
細部
- 重複セットは削除する必要があるため、部分的な順序付けを直接使用してコードを簡略化できることに注意してください
コード
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 )