组合

76 阅读1分钟

给定两个整数 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
};

算法实现的编程思想都是一样的,语言只是语法上的差别。