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









