你總共有 n 枚硬幣,你須要將它們擺成一個階梯形狀,第 k 行就必須正好有 k 枚硬幣。java
給定一個數字 n,找出可造成完整階梯行的總行數。ide
n 是一個非負整數,而且在32位有符號整型的範圍內。函數
示例 1:spa
n = 5code
硬幣可排列成如下幾行:數學
¤ ¤ ¤ ¤ ¤
由於第三行不完整,因此返回2.
示例 2:it
n = 8io
硬幣可排列成如下幾行:class
¤ ¤ ¤ ¤ ¤ ¤ ¤ ¤
由於第四行不完整,因此返回3.di
PS:
根據數學公式,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 { public int arrangeCoins(int n) { return (int) (-1 + Math.sqrt(1 + 8 * (long) n)) / 2; } }