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;
    }
}
相关文章
相关标签/搜索