题目描述
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
题解
排列组合的性质C(m,n)=C(m-1,n)+C(m-1,n-1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| vector<vector<int>> combine(int n, int k) { vector<vector<int>> comb; if (k == 0 || n < k)return comb; if (k == 1) { for (int i = 1; i <= n; i++) comb.push_back({ i }); return comb; } if (n == k) { vector<int> t; for (int i = 1; i <= n; i++) t.push_back(i); return { t }; } vector<vector<int>> c1 = combine(n - 1, k); vector<vector<int>> c2 = combine(n - 1, k - 1); for (int i = 0; i < c2.size(); i++) c2[i].push_back(n); c1.insert(c1.end(), c2.begin(), c2.end()); return c1; }
|
这个惨痛的经历告诉我们,学好数学是多么的重要。
题目描述
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
题解
遍历nums,对于现有的res中的每一个vector,将当前nums的元素附加在其后得到一个新的vector,放入res
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> res = { {} }; for (int i = nums.size() - 1; i >= 0; i--) { int item = nums[i]; int rsize = res.size(); for (int j = 0; j < rsize; j++) { vector<int> tmp = res[j]; tmp.push_back(item); res.push_back(tmp); } } return res; }
|