你总共有 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; } }