【題目】
給一個集合array,包含n個數。 規定集合的"值"為集合中所有元素的和。 求該集合的所有子集的值的和。
【示例】
數組[1,2] 它的子集有空集[],[1],[2],[1,2] 子集各自的值為0,1,2,3 所以子集值的和為0 1 2 3=6
【解法一】
思路:簡單暴力的方法就是窮舉數組所有的子集,然後逐個求子集的值,然後相加得到最終的結果。
缺點:時間複雜度高,每個集合的子集個數為2^n個。
實現:
太麻煩了,不實現了。
【解法二】
思路:通過計算每個元素在求和過程中出現的次數,嘗試獲取一種規律。
[1]==> 0 1=1 // 1出現一次[1,2]==>0 1 2 (1 2)=6 // 1出現2次,2出現2次[1,2,3]===>0 1 2 3 (1 2) (1 3) (2 3) (1 2 3)=24 // 1,2,3出現4次
好像有點規律了,每個元素在求和過程中出現的次數是一樣的。假設出現的次數是N。
sum = (1 2 3 4 ... n) * N
N的值又和數組的長度有關系,N=2^(n-1)
sum = (1 2 3 4 ... n) * 2^(n-1)
【實現】
var childrenArraySum = function(array){ var sum = array.reduce(function (a,b) { return a b; }) return sum * Math.pow(2, array.length-1);; }; childrenArraySum([1,2,3]); // 24
第二種解法的思路很巧妙,把原本很複雜的問題用簡單的方式解決了。算法或者說數學對程序員的影響還是很大的。如果在工作中能多思考一下又沒有更簡單的方法,下面這種寫法就不會出現了。
if(a){ for(var i=0;i<arr1.length;i ){ if(b){ for(var j=0;j<arr2.length;j ){ ....... } } } }
如果有覺得有意思,歡迎轉發收藏~~
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!