题目描述
leetcode题目链接:子集
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
举例
示例 1:输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:输入:nums = [0] 输出:[[],[0]]
解题方法:回溯搜索。扫描每一个数字,每次可以选择选或者不选当前数字,分两次处理。回溯算法的基本结构如下:(递归出口+做出选择+撤销选择)
results = []
void backtrack(路径,选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(做出选择后的路径, 选择列表) //继续下一个选择
撤销选择
代码
#include <iostream>
#include <vector>
void backtrack(const std::vector<int>& nums, int current,
std::vector<int>& tmp,
std::vector<std::vector<int>>& result) {
int n = nums.size();
if (current == n) { //所有的元素都判断过了是否选择
result.push_back(tmp);
return;
}
// 本次选择当前元素
tmp.push_back(nums[current]);
backtrack(nums, current + 1, tmp, result);
tmp.pop_back();
// 本次直接跳过当前元素(本次不选择当前数字)
backtrack(nums, current + 1, tmp, result);
}
std::vector<std::vector<int>> subset(const std::vector<int>& nums) {
std::vector<int> tmp;
std::vector<std::vector<int>> result;
backtrack(nums, 0, tmp, result);
return result;
}
void print_result(const std::vector<int>& nums,
const std::vector<std::vector<int>>& result) {
std::cout << "========" << std::endl;
std::cout << "input:" << std::endl;
for (auto num : nums) {
std::cout << num << " ";
}
std::cout << std::endl;
std::cout << "output:" << std::endl;
for (auto& arr : result) {
for (auto value : arr) {
std::cout << value << " ";
}
std::cout << std::endl;
}
}
int main()
{
// case1 : nums={1,2,3}
std::vector<int> nums = {1, 2, 3};
std::vector<std::vector<int> > result;
result = subset(nums);
print_result(nums, result);
// case2 : nums = {0}
nums = {0};
result = subset(nums);
print_result(nums, result);
return 0;
}
代码运行结果如下:
========
input:
1 2 3
output:
1 2 3
1 2
1 3
1
2 3
2
3
========
input:
0
output:
0