每天更新一道python or C++ leetcode题,力求讲解清晰准确,客官们可以点赞或者关注。
题目:
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
思路:
深度优先搜索+回溯,
遍历得到所有的解
普通代码:
class Solution:
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
ans_list = []#储存结果
a = list(range(1, n+1))
self.DFS(k, ans_list, [], a)
return ans_list
def DFS(self, k, ans_list, one_res, a):
if len(one_res) == k:#递归结束条件为长度达到k
ans_list.append(one_res)
else:
for i in range(len(a)):#a代表可选的数字的集合
self.DFS(k , ans_list, one_res + [a[i]], a[a.index(a[i])+1:])
C++:
class Solution {
public:
vector<vector<int> > res;//储存最终结果
void generateCombined(int n,int k,int start,vector<int> c){
if(c.size()==k){
res.push_back(c);//终止条件
return;
}
for(int i=start;i<=n;i++){
c.push_back(i);//先加入一个数
generateCombined(n,k,i+1,c);
c.pop_back();//弹出最后加入或者后面加入的数,避免递归无法终止
}
}
vector<vector<int> > combine(int n, int k) {
if(n<=0||k<=0||k>n)
return res;
vector<int> c;
generateCombined(n,k,1,c);
return res;
}
};
作弊代码:Python
class Solution:
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
from itertools import combinations
s = list(range(1, n + 1))
return list(combinations(s, k))
总结:
这道题不难,但练习价值还是有的
1.itertools.combinations 这个函数接受一个列表,接受一个数字,能产生长度等于指定数字的所有集合。
2.C++ 和 Python 的区别比较大。在写python的时候,我习惯把待选的数字组成一个集合,通过python简单的切片达到选择数字的目的。C++则是直接设置开始(start)变量来表示下一个要选的数字。同时储存每一次集合的答案的变量,python可以直接写着函数调用的参数里,而C++则需要通过pop_back()方式去模拟回溯。所以确实C++难啊!!