排列硬币
Arranging Coins
解
方法一:暴力法
int arrangeCoins(int n)
{
int i = 1;
while (n >= i){
n -= i;
i++;
}
return i - 1;
}
结果
方法二:二分法
int arrangeCoins(int n)
{
long left = 0, right = n / 2 + 1, mid, temp; //用 long 防止溢出
while (left <= right){
mid = left + (right - left) / 2;
temp = (mid + 1) * mid / 2;
if(temp == n){
return (int)mid;
}else if(temp < n){
left = mid + 1;
}else{
long previous = mid * (mid - 1) / 2;
if (n > previous){
return (int)(mid - 1);
}else{
right = mid - 1;
}
}
}
return -1;
}
结果
方法三:数学法
易知:前 i 行完整的硬币数量为i * (i + 1) / 2
,前 i+1 行则为 (i + 2) * (i + 1) / 2
。
∴ (i + 1)*i / 2 ≤ n < (i + 2) * (i + 1) / 2
∴sqrt(2n + 0.25) - 1.5 < n ≤ sqrt(2n + 0.25) - 0.5
int arrangeCoins(int n)
{
return (int)(sqrt(2 * (double)n + 0.25) - 0.5);
}
结果