参加了一位博主的思路,加上自己的一些理解
题目描述:
给一整数 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
思路:
从最简单的两个元素出发{1,2},子集:{1}, {2}, {1,2},{} sum = 6
此时:我们如果在加上一个3,也就是找集合{1,2,3}的子集,有趣的地方就来了
新集合的子集:①原来{1,2}的子集;②原来{1,2}的子集,每个集合里加上元素3;③新集合{3}
得到递推公式:sum_of_All_subset(3) = sum_of_All_subset(2) * 2 + 3 * pow(2, 3 - 1);
3 * pow(2, 3 - 1):相当于3出现了2^(3 - 1)次方次:及{1, 2}的自己个数2 ^ (2 - 1) 加上1
同理将{1, 2, 3}看作一个新的整体加上元素4,新集合的子集也可以分为原来的三种情况
因此递归公式即为:sum_of_All_subset(n) = sum_of_all_subset(n - 1) * 2 + n * pow(2, n - 1)
代码:
class Solution { public: /* * @param : the given number * @return: Sum of elements in subsets */ int subSum(int n) { // write your code here if(0 == n) return 0; long long int result = 0; result = subSum(n - 1) * 2 + n * static_cast<long long>(pow(2, n-1)); return result; } };
PS:注意一下整数范围,数据大了会有溢出
不得不说,自己数学确实是个战五渣。。。。不过,继续加油。