二分法
class Solution {
public int arrangeCoins(int n) {
long l = 0;
long r = n;
while(l <= r){
long m = l + (r-l) / 2;
long sum = (1 + m) * m / 2;
if(0 <= n - sum){
l = m + 1;
}else{
r = m - 1;
}
}
return (int)l - 1;
}
}
公式法
这里解释下公式法,(1+x)*x/2 <= n,那么等价于d = n - (1+x)*x/2 最小但是要大于0,这是一个开口向下的二次函数,求根公式
,由于x肯定是正的,所以x = -0.5 +
,这里的正负值有点绕,自己翻一下初中课本
class Solution {
public int arrangeCoins(int n) {
return (int)(-0.5+Math.sqrt(2*(long)n+0.25));
}
}