题目地址:Combinations
题目简介:
给定两个整数和 ,返回中所有可能的个数的组合。
Example:
Input: n = 4, k = 2
Output:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
题目解析:
1、暴力深搜
当n=4, k=1时,对应的Output有
[
[1],
[2],
[3],
[4]
]
结合上面的例子可以看到,k=2时,以4开头的就不能组合长度为2的组合,所以就将[4]抛弃。在前面的三个组合中继续组合,可以看到在k的基础上,要求长度为k+1的组合的时候,要删掉k里最后一个数字为n的组合。
C++版:
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> ans;
if (k == 1)
{
for (int i = 0; i < n; i++)
{
vector<int> temp;
temp.push_back(i + 1);
ans.push_back(temp);
}
return ans;
}
else
{
vector<vector<int>> last_ans = combine(n, k - 1);
int len = last_ans.size();
for (int i = 0; i < len; i++)
{
if (last_ans[i].back() != n)
{
int tmp = last_ans[i].back();
while(++tmp != n + 1)
{
vector<int> temp = last_ans[i];
temp.push_back(tmp);
ans.push_back(temp);
}
}
}
}
return ans;
}
};
Python版:
class Solution(object):
def combine(self, n, k):
ans = []
if k == 1:
return [[i] for i in range(1,n+1)]
else:
last_ans = self.combine(n,k - 1)
for ls in last_ans:
if(ls[-1] != n):
tmp = ls[-1] + 1
while tmp != n + 1:
temp = []
temp.extend(ls)
temp.append(tmp)
ans.append(temp)
tmp += 1
return ans
2、直接暴力
可以观察到当n和k确定时,对应的组合集中最大的第一个数字便得到了确定。例如当n = 4, k = 2时,开头最大为3=n - k + 1。只要在其后增加足够的数字即可。
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int> > ans;
for (int i = 0; i < n - k + 1; i++)
{
vector<int> temp;
temp.push_back(i + 1);
ans.push_back(temp);
}
k--;
while(k--)
{
vector<vector<int> > temp_ans;
int len = ans.size();
for (int i = 0; i < len; i++)
{
int tmp = ans[i].back();
while(++tmp != n + 1)
{
vector<int> temp = ans[i];
temp.push_back(tmp);
temp_ans.push_back(temp);
}
}
ans = temp_ans;
}
return ans;
}
};