注意: 解决方案集不得包含重复的子集。
Example: Input: nums = [1,2,3] Output: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
该问题可以通过两种方式解决:
- 迭代式
- 回溯
解决方案1:迭代解决方案。
在此解决方案中,我们采用2个循环,即外循环和内循环。然后,我们开始迭代添加元素。
以[1、2、3]为例,迭代过程如下:
最初设置:[[]]
第一次迭代后,子集将为:[[],[1]];
在第二次迭代之后,子集将为:[[],[1],[2],[1、2]];
在第三次迭代之后,子集将为:[[],[1],[2],[1、2],[3],[1、3],[2、3],[1、2、3 ]]。
C ++解决方案
#include<iostream> #include<vector> using namespace std; vector<vector<int>> get_subsets_iterative(vector<int>& input_set) { vector<vector<int>> result_set(1, vector<int>()); for (int i = 0; i < input_set.size(); i++) { int n = result_set.size(); for (int j = 0; j < n; j++) { result_set.push_back(result_set[j]); result_set.back().push_back(input_set[i]); } } return result_set; } void subsets(vector<int>& nums, int start, vector<int>& temp, vector<vector<int>>& final_set) { final_set.push_back(temp); for (int i = start; i < nums.size(); i++) { temp.push_back(nums[i]); subsets(nums, i + 1, temp, final_set); temp.pop_back(); } } vector<vector<int>> get_subsets_backtrack(vector<int>& nums) { vector<vector<int>> final_set; vector<int> temp; subsets(nums, 0, temp, final_set); return final_set; } int main() { vector<int> input_set = {1, 2, 3}; //vector< vector<int> >result = get_subsets_iterative(input_set); vector< vector<int> >result = get_subsets_backtrack(input_set); for (int i = 0; i < result.size(); i++) { for (int j = 0; j < result[i].size(); j++) { cout<< result[i][j]<<" "; } cout<<endl; } }
输出:
1 2 1 2 3 1 3 2 3 1 2 3
该网站上可用的教程列表:
C编程20+章 | C ++编程80+章 |
100多个编码问题 | 数据结构和算法85+章 |
系统设计20+章 | Shell脚本编写12章 |
4g LTE 60+章节 | 最常见的编码问题 |
5G NR 50+章 | Linux系统编程20+章 |