Java實現 LeetCode 441 排列硬幣

441. 排列硬幣

你總共有 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;
    }
}
相關文章
相關標籤/搜索