给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
golang
func combine(n int, k int) [][]int {
var temp=[]int{}
var dfs func(idx int)
var ans=[][]int{}
dfs=func(idx int){
//temp的长度与区间【idx,n】的长度相加小于k,不可能构建一个temp出来,比如n=5,k=3,idx=6,temp=【4,5】,这种情况不成立
if len(temp)+(n-idx+1) <k{
return
}
if len(temp)==k{
copyTemp:=make([]int,k)
copy(copyTemp,temp)
ans=append(ans,copyTemp)
return
}
//考虑选择当前位置
temp=append(temp,idx)
dfs(idx+1)
temp=temp[:len(temp)-1]
//不考虑选择当前位置
dfs(idx+1)
}
dfs(1)
return ans
}
接下来用javascript来实现(相对于golang,js代码实现起来更加简洁):
* @param {number} n
* @param {number} k
* @return {number[][]}
var combine = function(n, k) {
let res=[]
const dfs=(idx,temp)=>{
if(temp.length+(n-idx+1)<k) return
if(temp.length===k){
res.push(temp)
return
}
dfs(idx+1,[...temp,idx])
dfs(idx+1,[...temp])
}
dfs(1,[])
return res
};
最后typescript实现
function combine(n: number, k: number): number[][] {
const ans:Array<Array<number>>=[] //定义一个number类型的二维数组
const dfs=(idx: number, temp :Array<number>)=>{
if(temp.length+(n-idx+1)<k) return
if(temp.length===k){
ans.push(temp)
return
}
dfs(idx+1,[...temp,idx])
dfs(idx+1,temp)
}
dfs(1,[])
return ans
};
算法实现的编程思想都是一样的,语言只是语法上的差别。