0%

combinations & subsets

题目描述

给定两个整数 nk,返回 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) {
//C(m,n)=C(m-1,n)+C(m-1,n-1)
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;
}