做這題我的心中是十分難受的,sad,花了4個小時,沒有通過。
主要是遇到這個測試點過不了。
我覺得是取餘那一塊有點問題,但自認為邏輯是沒有錯的。也就是下面的**是沒有ac的**。
給出乙個含有不重複整數元素的陣列,每個整數均大於 1。
我們用這些整數來構建二叉樹,每個整數可以使用任意次數。
其中:每個非葉結點的值應等於它的兩個子結點的值的乘積。
滿足條件的二叉樹一共有多少個?返回的結果應模除 10 ** 9 + 7。
示例 1:
輸入: a = [2, 4]輸出: 3解釋: 我們可以得到這些二叉樹: [2], [4], [4, 2, 2]
示例 2:
輸入: a = [2, 4, 5, 10]輸出: 7解釋: 我們可以得到這些二叉樹: [2], [4], [5], [10], [4, 2, 2], [10, 2, 5], [10, 5, 2].
1 <= a.length <= 1000.
2 <= a[i] <= 10 ^ 9
.
看示例就可以明白並不是要真的建一顆樹,而是找出符合要求的排列組合。單個因子也算是符合要求。
以示例2為例,有7個組合符合要求。其中,2作為父節點的出現1次,4作為父節點出現兩次,5作為父節點出現1次,10作為父節點出現3次。
所有的輸出就是各個元素作為父節點出現的次數之和。
問題轉換為求每個元素作為父節點的次數。
先看示例2:
看元素4,它除了有單個元素作為一種答案,還有[4,2,2]這樣。所以總的次數變為了1+1=2;
看元素10它,除了有單個元素作為一種答案,還有[10,2,5], [10,5,2]。總的次數變為了1+2=3.
上面1次就差在4的兩個子節點一樣,而10的兩個子節點不一樣,可以調換位置。
示例2能得到的資訊貌似就這麼多了,自己再想個示例,[2,4,5,8]。這個示例的輸出個數好像會比示例2多。
[2,4,5,8]窮舉一下,看看有哪幾種。[2], [4], [5], [8]; [4,2,2], [8,4,2], [8,2,4]; [8,4,2,2,2]; [8,2,4,2,2],以上組合都以層次遍歷的方式排列。
統計下,一共有9次輸出,以2為父節點1次,4為父節點2次,5為父節點1次,8為父節點5次。
研究下元素8吧:
它的子節點從2,4中取,那會不會和(以2為父節點的次數1次)、(以4為父節點2次)這個兩個數字有關。
好像是以8為父節點的次數5 = 1 * 2 * 2 + 1;實際上這就是我找的規律。
等式右邊一共有4個數字,
第乙個數字1:是以2為父節點的次數;
第二個數字2:是以4為父節點的次數;
第三個數字2: 它是乙個引數,當父節點兩邊的因子一樣時,它取1,如示例2中,父節點4出現的次數2 = 1 * 1 * 1 + 1;不一樣時,它取2;
第四個數字1:它是父節點8被賦的初始值。
可以隨便想個示例,看看上面這個規律是不是適用。
對輸入陣列a從小到大排序,方便順序遍歷
用乙個map容器記錄m元素作為父節點出現的次數。對a遍歷一遍,每個元素加入到m中,並且賦初值為1。
主函式是兩個for迴圈,進行m中值的更新,所有更新不是一步到位。比如一開始某個元素parent通過它的乙個child更新了,後來child出現的次數增加了,
parent的次數也要作相應增加。
通過文字想表達清楚意思實在太難了,畫圖工程量太大。直接上我的**吧,只要不要像一開始的那種程度的測試點,應該都能過。
1 #include 2 #include 3 #include 4 #include 5 #include 6using
namespace
std;78
class
solution
38else
3943
44 m[mul] +=more;
45 updatefatherof(mul, more); //
mul已經更新了,順便也要更新以它的乘子的父親們46}
47}48}
4950
int cnt = 0;51
//output
52for
(auto i : m)
5363
intf;
64if(i.second >=inf)
65 f %=inf;
66else
67 f =i.second;
6869 backsum %=inf;
70 backsum +=f;71}
72return
backsum;73}
7475
void updatefatherof(int x, unsigned long
long
exceed)
7685
else
8690
} 91}92
};93
94int
main()95;
9899 vector vec(a, a + sizeof(a)/sizeof(int
));100 cout << "
滿足條件的二叉樹一共有:
"<< endl << s.numfactoredbinarytrees(vec) <101return0;
102 }
823 帶因子的二叉樹
題目描述 給出乙個含有不重複整數元素的陣列,每個整數均大於 1。我們用這些整數來構建二叉樹,每個整數可以使用任意次數。其中 每個非葉結點的值應等於它的兩個子結點的值的乘積。滿足條件的二叉樹一共有多少個?返回的結果應模除 10 9 7。示例 1 輸入 a 2,4 輸出 3 解釋 我們可以得到這些二叉樹...
Leetcode 823 帶因子的二叉樹
給出乙個含有不重複整數元素的陣列,每個整數均大於 1。我們用這些整數來構建二叉樹,每個整數可以使用任意次數。其中 每個非葉結點的值應等於它的兩個子結點的值的乘積。滿足條件的二叉樹一共有多少個?返回的結果應模除 10 9 7。示例 1 輸入 a 2,4 輸出 3解釋 我們可以得到這些二叉樹 2 4 4...
二叉樹 二叉樹
題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...