精品推荐:
《征服数据结构》专栏:50多种数据结构彻底征服
《经典图论算法》专栏:50多种经典图论算法全部掌握
一网友在网上询问:发现leader是大专毕业,怎么办?他大专和你有啥关系啊。leader学历是大专,可能人家来的早,并且leader不一定需要很高的技术,只要会管理就行。技术需要的是智商,管理需要的是情商,智商高的不一定情商高,所以leader的学历不如你很正常。
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第77题:组合。
问题描述
输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
输入:n = 1, k = 1
输出:[[1]]
1 <= n <= 20
1 <= k <= n
问题分析
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> ans = new ArrayList<>();
dfs(ans, new ArrayList<>(k), n, k, 1);
return ans;
}
private void dfs(List<List<Integer>> ans, List<Integer> path, int n, int k, int start) {
if (path.size() == k) {
ans.add(new ArrayList<>(path));
return;
}
for (int i = start; i <= n; i++) {
path.add(i);// 选择
dfs(ans, path, n, k, i + 1);// 递归到下一层
path.remove(path.size() - 1);// 撤销选择
}
}
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> ans;
vector<int> path;
dfs(ans, path, n, k, 1);
return ans;
}
void dfs(vector<vector<int>> &ans, vector<int> &path, int n, int k, int start) {
if (path.size() == k) {
ans.emplace_back(path);
return;
}
for (int i = start; i <= n; i++) {
path.emplace_back(i);// 选择
dfs(ans, path, n, k, i + 1);// 递归到下一层
path.pop_back();// 撤销选择
}
}
def combine(self, n: int, k: int) -> List[List[int]]:
ans = []
path = []
def dfs(start: int):
if len(path) == k:
ans.append(path[:])
return
for i in range(start, n + 1):
path.append(i) # 选择
dfs(i + 1) # 递归到下一层
path.pop() # 撤销选择
dfs(1)
return ans