leetcode 78題 子集(c 三種解法)

2021-09-22 14:04:06 字數 1804 閱讀 9943

給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。

說明:解集不能包含重複的子集。

示例:

輸入: nums = [1,2,3]

輸出:[

[3],

[1],

[2],

[1,2,3],

[1,3],

[2,3],

[1,2],

]

解題思路1(包含三種解題方法):這個我沒看懂作者本人的解題思路,沒看懂樹是怎麼建的

因此找到了解題思路2:是對解題思路1中作者的想法的乙個詳細講解

/ \

/ \

/ \

/ \

/ \

[1]

/ \ / \

/ \ / \

[1 2] [1] [2]

/ \ / \ / \ / \

[1 2 3] [1 2] [1 3] [1] [2 3] [2] [3]

第一層為空集,第二層為對第乙個數的選擇,以此類推。左節點代表選中,右節點代表不選。

方法1:用dfs解決,對應解題思路1的第乙個方法

注意的點:

1.每次乙個數字出棧就相當於選擇了不選擇它的路。

2.為什麼從第一層開始迴圈?因為根節點不存在不選擇它的情況。

class solution 

void getsub(vectors,vector> &result,int layer,vector&tmp)

}};

方法2:用bitmap解決,對應解題思路1的第二個方法

感覺原鏈結中的**寫的非常棒!

外層迴圈控制對陣列中每個數字的選擇,內層迴圈是從二進位制數000到111所有情況的列舉。

class solution 

};

方法3:對應解題思路1的第三個方法

即:第二種解法讓我很驚嘆。它是發掘到了乙個規律,集合中每新增乙個元素,則子集數目增加一倍,且增加的子集為所有原始子集加上新的元素。舉個例子:nums=[1,2,3] 

1. 初始時集合為空,子集為[ ]。 

2. 新增乙個元素1,即集合為[1]時,子集為空集和空集+元素1,即[ , [1] ]。 

3. 新增下乙個元素2,集合為[1,2],子集除了包含上一步的所有集合還新增了對應集合+元素2的所有集合,即[ , [1], [2], [1,2]],其中[2]是空集+元素2,[1,2]是[1]+元素2。 

4. 新增下乙個元素3,集合為[1,2,3],類似的得到子集為[ , [1], [2], [1,2], [3], [1,3], [2,3], [1,2,3] ],其中[3]是空集+元素3,[1,3]是[1]+元素3,[2,3]是[2]+元素3,[1,2,3]是[1,2]+元素3。

(**於第乙個鏈結)

class solution 

} return result;

}};

leetcode78子集 中等

給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 要列出陣列的所有子集,因為陣列是不含重複元素的,所以對於每乙個位置的數字,有兩個選擇,選或者不選。可以畫出以...

LeetCode 78 子集 Go 實現

子集 給你乙個整數陣列 nums 陣列中的元素 互不相同 返回該陣列所有可能的子集 冪集 解集 不能 包含重複的子集。你可以按 任意順序 返回解集。示例 1 輸入 nums 1,2,3 輸出 1 2 1,2 3 1,3 2,3 1,2,3 示例 2 輸入 nums 0 輸出 0 func subse...

leetcode 78 子集 回溯法

給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 class solution return res void recruise vector int num...