leecode441 排列硬幣(數學,二分查詢)

2021-10-08 06:24:35 字數 1582 閱讀 5347

我的題解:超時

大佬題解1:數學公式:

大佬題解二,三種思路

441. 排列硬幣

你總共有 n 枚硬幣,你需要將它們擺成乙個階梯形狀,第 k 行就必須正好有 k 枚硬幣。

給定乙個數字 n,找出可形成完整階梯行的總行數。

n 是乙個非負整數,並且在32位有符號整型的範圍內。

示例 1:

n = 5

硬幣可排列成以下幾行:

¤¤ ¤

¤ ¤因為第三行不完整,所以返回2.

標籤:二分查詢,數學

class

solution

return i-1;

}}

根據數學公式,k(k+1) /2 = n,可以得到其正數解為:k = sqrt(2n+1/4) - 1/2。然後求整即可。

唯一的問題是,這裡2n+1/4有可能會超出sqrt函式的引數範圍。

於是,我們可以變換一下, k = sqrt(2) * sqrt(n+1/8) - 1/2,這樣求平方根就不會超限了。

於是,我們就有了這麼一行**

class

solution

}

/**

* 數學求解法 o(1) 不含求根預算

** @param n

* @return

*/public

static

intarrangecoins

(int n)

/** * 迭代求解法 o(n)//類似我的解法但是好像這些寫不會 沒超時

** @param n

* @return

*/public

static

intarrangecoins2

(int n)

return i -1;

}/**

* 二分查詢,o(log(n / 2 + 1))

** @param n

* @return

*/public

static

intarrangecoins3

(int n)

else

if(mid *

(mid +1)

<=

(long)2

* n)

else

}return

(end *

(end +1)

==(long)2

* n)?(

int) end :

(int

) start;

}

@elenorechang 能講解一下為啥要用long嗎

因為判斷條件mid * (mid + 1)用 int 會溢位的,當然也可以把變數型別設定為 int,判斷條件中if ((long)mid * (long)(mid + 1) == (long) 2 * n)

441 排列硬幣

你總共有 n 枚硬幣,你需要將它們擺成乙個階梯形狀,第 k 行就必須正好有 k 枚硬幣。給定乙個數字 n,找出可形成完整階梯行的總行數。n 是乙個非負整數,並且在32位有符號整型的範圍內。示例 1 n 5 硬幣可排列成以下幾行 因為第三行不完整,所以返回2.示例 2 n 8 硬幣可排列成以下幾行 因...

441 排列硬幣

題目描述 你總共有 n 枚硬幣,你需要將它們擺成乙個階梯形狀,第 k 行就必須正好有 k 枚硬幣。給定乙個數字 n,找出可形成完整階梯行的總行數。n 是乙個非負整數,並且在32位有符號整型的範圍內。示例 1 n 5 硬幣可排列成以下幾行 因為第三行不完整,所以返回2.示例 2 n 8 硬幣可排列成以...

LeetCode 441 排列硬幣

你總共有 n 枚硬幣,你需要將它們擺成乙個階梯形狀,第 k 行就必須正好有 k 枚硬幣。給定乙個數字 n,找出可形成完整階梯行的總行數。n 是乙個非負整數,並且在32位有符號整型的範圍內。執行用時 36ms 記憶體消耗 14mb 題後反思 這個時候就看出數學的用處了,一句話就可以代替注釋中的全部內容...