n个数字,求组合数量和各个组合内容,包含元素相同的去重(kotlin)

本文探讨了如何计算给定数字的组合数量,包括使用组合公式和递归方法。同时,介绍了如何通过回溯法生成所有不重复的组合。文章提供了一段Kotlin代码示例,展示了去重前后的组合生成,并强调了使用distinct函数在去重后生成正确结果的重要性。
摘要由CSDN通过智能技术生成


前言

在数学和计算机科学中,组合是指从给定的集合中选择若干元素形成一个子集的方式。本文将介绍如何求解给定n个数字的组合数量以及各个组合内容的方法。

本来在进行开开心心的工作(摸鱼),同事说,你很无聊吗?无聊我给你找个事情做啊。
我 :
在这里插入图片描述
好啊好啊!


一、问题

在这里插入图片描述
看到去重之前,是不是瞧不起人嘛,太简单了嘛。

求组合数量的方法:

使用组合公式:组合数量可以通过组合公式来计算,公式为

C ( n , k ) = n ! / ( k ! ∗ ( n − k ) ! ) C(n, k) = n! / (k! * (n-k)!) C(n,k)=n!/(k!(nk)!)

其中n为总数字个数,k为每个组合中的数字个数。
使用递归:通过递归的方式,可以将问题拆分为更小的子问题,然后累加子问题的解来得到最终的组合数量。

在这里插入图片描述

看到去重后,是不是太瞧得起我了嘛,这谁做得来嘛。
在这里插入图片描述

求各个组合内容的方法:

使用回溯法:回溯法是一种通过不断尝试不同的选择来求解问题的方法。可以使用回溯法来生成所有可能的组合,并记录下每个组合的内容。

二、解决问题

1.去重前

先把没去重的写出来

fun generateCombinations(numbers: List<Int>): List<List<Int>> {
  val combinations = mutableListOf<List<Int>>()
  for (i in 0 until numbers.size) {
   val combination = mutableListOf<Int>()
   combination.add(numbers[i])
   combinations.add(combination)
   for (j in i + 1 until numbers.size) {
    combination.add(numbers[j])
    combinations.add(combination.toList())
   }
  }
  return combinations
 }

双重for循环遍历所有可能性,没什么好说的啊

2.去重后

我做不来(狗头),那怎么办呢,我可不是摆烂的人啊!那问题又来了,那怎么办呢?!chatgpt!!!

fun generateCombinations(numbers: List<Int>): List<List<Int>> {
  val combinations = mutableListOf<List<Int>>()
  for (i in 0 until numbers.size) {
   val combination = mutableListOf<Int>()
   combination.add(numbers[i])
   combinations.add(combination)
   for (j in i + 1 until numbers.size) {
    combination.add(numbers[j])
    combinations.add(combination.toList())
   }
  }
  return combinations.distinct()
 }

没错,你没有看错只多了一个distinct函数,chatgpt简直就是俺的神让我们看看源码
在这里插入图片描述
妈妈再也不用担心我的学习!


总结

最后来个1到256的list测试一下

 fun SummationAnddeDuplication() {
  val long = System.currentTimeMillis()
  val numbers = mutableListOf<Int>()
  for (i in 1..256){
   numbers.add(i)
  }
  val combinations = generateCombinations(numbers)
  println("Combinations:")
  combinations.forEach { println(it) }
  val long1 = System.currentTimeMillis()-long
  println("Number of combinations: ${combinations.size}" +"   time :  ${long1/1000}s" )

 }

 fun generateCombinations(numbers: List<Int>): List<List<Int>> {
  val combinations = mutableListOf<List<Int>>()
  for (i in 0 until numbers.size) {
   val combination = mutableListOf<Int>()
   combination.add(numbers[i])
   combinations.add(combination)
   for (j in i + 1 until numbers.size) {
    combination.add(numbers[j])
    combinations.add(combination.toList())
   }
  }
  return combinations.distinct()
 }

输出
在这里插入图片描述
真不错呢,chatgpt辅助学习写代码真的挺有用的!
在这里插入图片描述
本文介绍了求解给定n个数字的组合数量以及各个组合内容的方法。通过组合公式或递归可以求解组合数量,而使用回溯法可以生成所有可能的组合内容。希望本文对读者有所帮助!如有任何问题,请随时提问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我怀里的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值