Go语言实现的排列组合问题实例(n个数中取m个)

2020-01-28 12:05:41于海丽

    for i := 0; i < len(leftNums); i++ {
        if i < sum {
            leftNums[i] = 1
        } else {
            leftNums[i] = 0
        }
    }
}
//根据索引号数组得到元素数组
func findNumsByIndexs(nums []int, indexs [][]int) [][]int {
    if len(indexs) == 0 {
        return [][]int{}
    }
    result := make([][]int, len(indexs))
    for i, v := range indexs {
        line := make([]int, 0)
        for j, v2 := range v {
            if v2 == 1 {
                line = append(line, nums[j])
            }
        }
        result[i] = line
    }
    return result
}

注:n个元素中取m个一共有多少种取法可直接通过数学公式计算得出,即:
//数学方法计算排列数(从n中取m个数)
func mathPailie(n int, m int) int {
    return jieCheng(n) / jieCheng(n-m)
}
//数学方法计算组合数(从n中取m个数)
func mathZuhe(n int, m int) int {
    return jieCheng(n) / (jieCheng(n-m) * jieCheng(m))
}
//阶乘
func jieCheng(n int) int {
    result := 1
    for i := 2; i <= n; i++ {
        result *= i
    }
    return result
}

通过此公式可以简单的验证一下上述程序的结果是否正确。

(二)排列问题

从n个数中取出m个进行排列,其实就是组合算法之后,对选中的m个数进行全排列。而全排列的问题在之前的文章中已经讨论过了。

代码实现:
func pailieResult(nums []int, m int) [][]int {
    //组合结果
    zuhe := zuheResult(nums, m)
    //保存最终排列结果
    result := make([][]int, 0)
    //遍历组合结果,对每一项进行全排列
    for _, v := range zuhe {
        p := quanPailie(v)
        result = append(result, p...)
    }
    return result