所有子集的和

Lintcode 730

已知

给一整数 n, 我们需要求前n个自然数形成的集合的所有可能子集中所有元素的和。

示例

给出 n = 2, 返回 6
可能的子集为 {{1}, {2}, {1, 2}}. 
子集的元素和为 1 + 2 + 1 + 2 = 6

给出 n = 3, 返回 24
可能的子集为 {{1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}
子集的和为:
1 + 2 + 3 + (1 + 2) + (1 + 3) + (2 + 3) + (1 + 2 + 3) = 24

思路

其实这更像是一个数学问题,而不是代码问题。以4为例子,取一个数,则取1的可能性为1种,取两个数字,则取1的可能性为3种,取三个数字,则取1的可能性为3种,取四个数字,可能性为1种,则1总共计算了 1+3+3+18次, 其他三个数字也是8次。
所以,结合上面两个示例,很容易可以推的:
当已知n的值时,我们会取里面的数字2^(n-1)次
每一次的值为1+2+3+...+n

代码:

因为代码本身只有一句,这里就不贴了,不过提醒读者注意,当值的计算过程中有可能超过Integer.MAX_VALUE时,比如说X * Y / 2这样的计算式,必须把乘放最后计算,否则超过界限就会变成负数,从而造成结果的出错

结语:

谢谢您的观看,希望对您有所帮助❥(ゝω・✿ฺ)

猜你喜欢

转载自blog.csdn.net/mio_bass/article/details/78797298