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+1 共8次, 其他三个数字也是8次。
所以,结合上面两个示例,很容易可以推的:
当已知n的值时,我们会取里面的数字2^(n-1)次
每一次的值为1+2+3+...+n
代码:
因为代码本身只有一句,这里就不贴了,不过提醒读者注意,当值的计算过程中有可能超过Integer.MAX_VALUE时,比如说X * Y / 2这样的计算式,必须把乘放最后计算,否则超过界限就会变成负数,从而造成结果的出错
结语:
谢谢您的观看,希望对您有所帮助❥(ゝω・✿ฺ)