題目連結(https://leetcode.com/problems/subsets/description/)
Given an integer array nums
of unique elements, return all possible subsets (the power set).
The solution set must not contain duplicate subsets. Return the solution in any order.
backtracking 題
nums
,陣列中的值都是獨立元素1 <= nums.length <= 10
10 <= nums[i] <= 10
nums
are unique.Example 1:
Input: nums = [1,2,3]
Output: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
Example 2:
Input: nums = [0]
Output: [[],[0]]
backtracking
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res; // 儲存所有子集合
vector<int> subset; // 當前正在建立的子集合
setcreation(nums, 0, res, subset);
return res;
}
void setcreation(vector<int>& nums, int index, vector<vector<int>>& res, vector<int>& subset){
// 1️⃣ 終止條件:遍歷完所有元素
if(index == nums.size()){
res.push_back(subset);
return;
}
// 2️⃣ 選擇包含當前元素 nums[index]
subset.push_back(nums[index]); // 做選擇
setcreation(nums, index+1, res, subset); // 遞迴
// 3️⃣ 回溯:撤銷選擇
subset.pop_back(); // 恢復
// 4️⃣ 選擇不包含當前元素
setcreation(nums, index+1, res, subset);
}
};
決策樹(二元樹)
[]
/ \
選1 / \ 不選1
/ \
[1] []
/ \ / \
選2 / \不2 / \
/ \ / \
[1,2] [1] [2] []
/ \ / \ / \ / \
/ \ / \/ \ / \
[1,2,3][1,2][1,3][1][2,3][2][3][]
void setcreation(vector<int>& subset) // ✓ 參考:共用同一個陣列
void setcreation(vector<int> subset) // ✗ 值:每次複製,沒有回溯效果
void backtrack(參數) {
if (終止條件) {
收集結果;
return;
}
for (每個選擇) {
做選擇; // subset.push_back()
backtrack(下一步); // 遞迴
撤銷選擇; // subset.pop_back()
}
}
ps. 部分內容經 AI 協助整理