大家好,又见面了,我是你们的朋友全栈君。
这是阿里的第二场笔试,本来觉得没啥好写的,一道排列组合,一道迷宫。没有什么发挥的空间。但是后来在和大家讨论的过程中,把这道题的公司给敲出来了,但是这公式也不能白敲,干脆写一篇文章总结一下。
题目描述
一共n个人,从中选出任意个人组成一队,我们不妨记为k,再从k个人选出一人做队长。
题目分析
这是一个典型的排列组合问题,从n个人选出k个,可能是 C n k C_n^k Cnk,从k个人选出一个队长,种类数是 k k k,但是k可以是 1 1 1~ n n n,所以这个题的结果就是 ∑ k = 1 n k C n k \sum_{k=1}^nkC_n^k ∑k=1nkCnk,这样写代码是可以过一些例子的。
但是不会全过,因为复杂度过大。当然可以在求 C n k C_n^k Cnk的时候利用 C n k = C n k − 1 ∗ n + 1 − k k C_n^k=C_n^{k-1}*\frac{n+1-k}{k} Cnk=Cnk−1∗kn+1−k这个公式,因为 C n k − 1 C_n^{k-1} Cnk−1我们也是要计算的,这样就会减少一定的复杂度,然后又能多过一些例子。
我们还会想到 C n k C_n^k Cnk= C n n − k C_n^{n-k} Cnn−k,这样又可以少一些计算。我们这时候就需要把 k ∗ C n k 和 ( n − k ) ∗ C n n − k k*C_n^k和(n-k)*C_n^{n-k} k∗Cnk和(n−k)∗Cnn−k一起计算,发现正好等于 n ∗ C n k n*C_n^k n∗Cnk或者 n ∗ C n n − k n*C_n^{n-k} n∗Cnn−k。
到这里如果熟悉排列组合的同学,可能会想到了如果把数列反着再加一次。
如果说这个题有什么需要总结的,就是一旦确定一个题目是排列组合的问题之后,可以去考虑使用公式优化计算量,当然时间紧迫,没有时间的话,就很难去优化了,还是需要注意平时多积累。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143075.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...