给定两个正整数 n 和 k ,请你返回 [1,n] 中所有包含 k 个数的组合。
你可以按任意顺序返回结果。
数据范围:
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @param k int整型 * @return int整型ArrayList<ArrayList<>> */ public static ArrayList<ArrayList<Integer>> combine(int n, int k) { // write code here ArrayList<ArrayList<Integer>> res = new ArrayList<>(); dfs(n, k, 0, res, new ArrayList<>()); return res; } public static void dfs(int n, int k, int pos, ArrayList<ArrayList<Integer>> res, ArrayList<Integer> current) { // 找到了满足的一组 if (current.size() == k){ res.add(new ArrayList<>(current)); return; } for (int i = pos; i < n; i++) { current.add(i + 1); // i+1 表示第 i个元素的值 dfs(n, k, i + 1, res, current); current.remove(current.size() - 1); } } }
package main //import "fmt" /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @param k int整型 * @return int整型二维数组 */ func combine( n int , k int ) [][]int { ans:=[][]int{} var dfs func([]int,int) dfs=func(path []int,idx int){ if len(path)==k{ tmp:=make([]int,k) copy(tmp,path) ans=append(ans,tmp) return } for i:=idx;i<=n;i++{ path=append(path,i) dfs(path,i+1) path=path[:len(path)-1] } } dfs([]int{},1) return ans }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @param k int整型 * @return int整型ArrayList<ArrayList<>> */ static ArrayList<ArrayList<Integer>> result = new ArrayList<>(); static ArrayList<Integer> path = new ArrayList<>(); public ArrayList<ArrayList<Integer>> combine (int n, int k) { // write code here backtrading(n,k,1); return result; } public static void backtrading(int n,int k ,int startIndex){ //递归结束条件 if(path.size() == k){ result.add(new ArrayList<>(path)); return; } //for嵌套 for(int i = startIndex;i<= n- (k-path.size())+1;i++ ){ path.add(i); backtrading(n,k,i+1); //回溯 path.remove(path.size()-1); } } }
# -*- coding: utf-8 -*- # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param n int整型 # @param k int整型 # @return int整型二维数组 # class Solution: """ 题目: https://www.nowcoder.com/practice/7cfd3675cc964ae6818a771ac97ece5f?tpId=196&tqId=40448&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3FjudgeStatus%3D3%26page%3D1%26pageSize%3D50%26search%3D%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196&difficulty=undefined&judgeStatus=3&tags=&title= 算法: 题目要求统计从区间[1,n]中选取k个数的所有组合,我们变换下思维,也就是从1 ~ n这n种物品选取k种放入k个盒子中的所有组合。使用辅助数组visited标记元素是否已访问。 设dfs(idx, combine),idx表示当前访问的盒子下标,combine表示当前已放置元素组合 初始化: dfs(0, []) dfs(idx, combine): 若idx = k:找到一组解并记录,return 枚举可以放入idx的元素: 加入combine,继续递归; 回溯 复杂度: 时间复杂度:O(n * (n - 1) * ... * (n - k + 1) / (k * (k - 1) * ... * 1)) # 排列组合数 空间复杂度:O(k) """ def combine(self, n, k): # write code here def dfs(idx, combine): if idx == k: res.append(combine[:]) return for i in range(1, n + 1): if not visited[i]: if combine and combine[-1] > i: continue combine.append(i) visited[i] = True dfs(idx + 1, combine) combine.pop() visited[i] = False res, visited = [], [False] * (n + 1) dfs(0, []) return res if __name__ == "__main__": sol = Solution() n, k = 3, 2 res = sol.combine(n, k) print res
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @param k int整型 * @return int整型ArrayList<ArrayList<>> */ private ArrayList<ArrayList<Integer>> res = new ArrayList<>(); public ArrayList<ArrayList<Integer>> combine(int n, int k) { // write code here dfs(n, k, new ArrayList<>(), 1); return res; } private void dfs(int n, int k, ArrayList<Integer> one, int start) { // 退出条件,找到了目标组合 if (one.size() == k) { res.add(new ArrayList<>(one)); return; } for (int i = start; i <= n; i++) { // 选择当前数 one.add(i); dfs(n, k, one, i + 1); // 回退 one.remove(one.size() - 1); } } }