通过递归完成
int arrangeCoins(int n) {
int res=0;
sum(n,res);
return res-1;
}
void sum(int n,int& res)
{
res++;
if(n<res)
return;
sum(n-res,res);
}
利用二次方程的根,为了防止溢出,使用long
int arrangeCoins(int n) {
long t=n,res;
res=(sqrt(1+8*t)-1)/2;
return res;
}
int arrangeCoins(int n) {
return ((-1 + sqrt(1 + 8 * (long)n)) / 2);
}
从第一行开始,每次用剩余的coin减去行数,检查剩余的硬币能否组成一行,不能则退出循环。时间复杂度O(n)。
int arrangeCoins(int n) {
int row=0;
while(n>=row){
n-=row;
row++;
}
return row-1;
}
利用二分法搜索,
int arrangeCoins(int n) {
long left=0,right=n;
if(n==1) return 1;
while(right-left>1){
long mid=left+(right-left)/2;
if(mid*(mid+1)/2<n) left=mid;
else if(mid*(mid+1)/2>n) right=mid;
else return mid;
}
return left;
}