本文最后更新于:2022年9月24日 凌晨
给定两个整数 n 和 k ,返回 1 … n 中所有可能的 k 个数的组合。
示例:
Solution
参考:《算法小抄》4.1 、[78 子集](78 子集.md)
class Solution : def combine (self, n: int , k: int ) -> List[List[int]]: if n<=0 or k<=0 : return res = [] tarck = [] def backtrack (n, k, start, tarck ): if k==len (tarck): res.append(tarck[:]) for i in range (start, n+1 ): tarck.append(i) backtrack(n, k, i+1 , tarck) tarck.pop() backtrack(n, k, 1 , tarck) return res
cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 class Solution {private : vector <vector <int >> res; void dfs (int n, int k, int start, vector <int >& cur) { if (cur.size()==k){ res.push_back(cur); return ; } for (int i=start; i<=n; ++i){ cur.push_back(i); dfs(n, k, i+1 , cur); cur.pop_back(); } return ; }public : vector <vector <int >> combine(int n, int k) { res.clear(); if (n<=0 || k<=0 || k>n) return res; vector <int > cur; dfs(n, k, 1 , cur); return res; } };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 class Solution {private : vector <vector <int >> res; void dfs (int n, int k, int start, vector <int >& cur) { if (cur.size()==k){ res.push_back(cur); return ; } for (int i=start; i<=n-(k-cur.size())+1 ; ++i){ cur.push_back(i); dfs(n, k, i+1 , cur); cur.pop_back(); } return ; }public : vector <vector <int >> combine(int n, int k) { res.clear(); if (n<=0 || k<=0 || k>n) return res; vector <int > cur; dfs(n, k, 1 , cur); return res; } };
java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 class Solution { List<List<Integer>> result; List<Integer> path; public List<List<Integer>> combine(int n, int k) { result = new ArrayList<>(); path = new ArrayList<>(); backtrack(n, k, 1 ); return result; } private void backtrack (int n, int k, int start) { if (path.size() == k) { result.add(new ArrayList<>(path)); return ; } for (int i = start; i <= n - (k - path.size()) + 1 ; ++i) { path.add(i); backtrack(n, k, i + 1 ); path.remove(path.size() - 1 ); } } }