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 思路: 其实这更像是一个数学问题,而不是代码问题。
+关注继续查看

已知

给一整数 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)次

上述分析来源:http://blog.csdn.net/mio_bass/article/details/78797298

根据上述分析,求解的公式就是

公式解析:因为最后把所有子集的所有项累加的表达式里面,1~n的每一个数都有机会出现2^(n-1)次,所以求和表达式就变为:

最终变为上面第一个公式。

利用第一个公式求解就非常方便了。

 

补充:

对于“会取里面的每个数字2^(n-1)次”的另一种解析可以如下进行:

集合里面有1~n共n个元素。构造子集的时候,对每个元素而言都有取或不取两种选择,所以子集数目共有2^(n-1)个。

讨论这些子集:原集合的元素ai只有选和不选两种情况,故所有子集分两类:包含ai的子集和不包含ai的子集。每一类的子集个数都是2^(n-1)个。

所以最后面计算累加和的时候需要累加ai的次数是2^(n-1)次,也就是元素ai对累加和的贡献是ai*2^(n-1)。

每一个元素出现的次数都是2^(n-1)次,所以上述第二个公式即可推出来。

 

代码比较简单就不写了。

 

 

其他参考:

http://blog.csdn.net/zhaohengchuan/article/details/78716365

http://blog.csdn.net/u010005161/article/details/52175525

 

相关文章
|
7月前
leetcode 416 分割等和子集
leetcode 416 分割等和子集
23 0
leetcode 416 分割等和子集
|
7月前
leetcode 90子集II
leetcode 90子集II
29 0
leetcode 90子集II
|
7月前
leetcode 78 子集
leetcode 78 子集
24 0
leetcode 78 子集
|
7月前
华为机试每日一练--第十题: 句子逆序
华为机试每日一练--第十题: 句子逆序
华为机试每日一练--第十题: 句子逆序
|
7月前
|
算法 Java
分割等和子集(LeetCode 416)
分割等和子集(LeetCode 416)
40 0
|
8月前
|
索引
LeetCode 1859. 将句子排序
一个 句子 指的是一个序列的单词用单个空格连接起来,且开头和结尾没有任何空格。每个单词都只包含小写或大写英文字母。
32 0
|
9月前
|
测试技术
分割等和子集(LeetCode-416)
分割等和子集(LeetCode-416)
38 0
分割等和子集(LeetCode-416)
|
10月前
LeetCode每日一题——805. 数组的均值分割
给定你一个整数数组 nums 我们要将 nums 数组中的每个元素移动到 A 数组 或者 B 数组中,使得 A 数组和 B 数组不为空,并且 average(A) == average(B) 。
55 0
|
10月前
LeetCode每日一题——698. 划分为k个相等的子集
给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。
73 0
|
算法 前端开发
「LeetCode」78-子集⚡️
「LeetCode」78-子集⚡️
65 0
「LeetCode」78-子集⚡️