823 帶因子的二叉樹

2022-05-19 16:52:59 字數 2894 閱讀 3054

做這題我的心中是十分難受的,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 6

using

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的所在子樹...