給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。
說明:解集不能包含重複的子集。
示例:
輸入:nums = [1,2,3]輸出:
[ [3],
[1], [2],
[1,2,3
], [
1,3],
[2,3
], [
1,2],
]
利用位數為陣列長度的二進位制數,這個二進位制數所能表示的元素個數剛好等於這個冪集的子集的個數,且二進位制數的每個數代表了一種子集的選擇情況,數字為1則表示選該數,數字0則表示不選該數
1class
solution
12list.add(sub);13}
14return
list;15}
16 }
leetcode執行用時:1 ms > 99.39%, 記憶體消耗:38.9 mb > 78.18%
外層迴圈執行2^n次,內層迴圈每輪執行n次,所以時間複雜度為 o(n*2^n)
列舉每個元素,把這個元素新增到現有的所有集合,然後把這個新集合加入list中
1class
solution 13}
14return
list;15}
16 }
leetcode執行用時:2 ms > 26.61%, 記憶體消耗:39.3 mb > 20.18%
時間複雜度:每次都把當前元素新增到list的所有集合中,所以每輪下來list中集合數量可以加倍,所以總的時間複雜度為o(1 + 2^1 + 2^2 +....+ 2^(n-1)) = o(2^n - 1) = o(2^n),可以看出這個演算法的效率比第一種方法要高
回溯法,對每個元素進行選與不選的判斷
1class
solution 9//
i表示元素的下標,sub用來儲存乙個子集
10public
void traceback(int nums, int i, arraylist> list, arraylistsub)
15//
不選當前元素
16 traceback(nums, i + 1
, list, sub);
1718
//選當前元素
19sub.add(nums[i]);
20 traceback(nums, i + 1
, list, sub);
21 sub.remove(sub.size() - 1); //
回溯到新增元素前的狀態 22}
23 }
時間複雜度:每個元素都有選與不選兩種情況,所以時間複雜度為 o(2^n)
空間複雜度:如果不考慮結果集的空間花費,遞迴棧的最大深度為 n層,所以這裡有乙個o(n)的空間花費,另外每層都會操作同乙個物件sub, 往這個集合中新增或刪除元素,所以這個sub的空間也是乙個空間開銷,sub最大為o(n), 所以該演算法的空間複雜度為o(2n)
力扣 78 子集
給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。該題目來自力扣題庫 示例輸入 nums 1,2,3 輸出 1 2 1,2 3 1,3 2,3 1,2,3 思路使用位圖法 如果該陣列的長度是n,那麼該陣列的所有子集數目是2 n.使用兩層迴圈,外層...
78 子集 力扣(LeetCode)
給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 求乙個陣列元素的所有組合 求乙個集合的冪集 回溯法 求乙個集合的冪集 用遞迴求解 class solutio...
子集(力扣第78題)
題目 給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 分析 子集的大小可以是從0到nums.length,也就是可以為空集,也可以和原始集合一模一樣。此題還...