题目描述
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
思路
1.这道题可以使用回溯思想求解。
2.首先确定一个元素将其加入到容器中,然后对于其他元素也进行相同操作。
3.当容器内的元素等于k时便是递归结束的条件。
4.进行回溯操作,将原先确定的元素从容器内移除。
Java代码实现
public List<List<Integer>> combine(int n, int k) { List<List<Integer>> res = new ArrayList<>(); combine(1,n,k,res,new ArrayList<>()); return res; } private void combine(int start,int n,int k,List<List<Integer>> res,List<Integer> cur) { //递归出口 if(cur.size() == k){ res.add(new ArrayList(cur)); return ; } for (int i = start; i <= n; i++) { //固定该元素 cur.add(i); //寻找k-1个其他元素的组合 combine(i+1,n,k,res,cur); //回溯 cur.remove(cur.size()-1); } }
Golang代码实现
func combine(n int, k int) [][]int { res := make([][]int,0) combineDG(1,n,k,[]int{},&res) return res } func combineDG(cur int,n int,k int,curNum []int, res *[][]int){ if k == 0{ copyNum := make([]int,len(curNum)) copy(copyNum,curNum) *res = append(*res,copyNum) return } for i:=cur; i<=n ; i++ { curNum = append(curNum,i) combineDG(i+1,n,k-1,curNum,res) curNum = curNum[0:len(curNum)-1] } }