题目描述
你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。
给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数
方法一:傻瓜
算法思想
1.既然要找到行数,如果n为1,就返回1,如果n不为1
2.for循环,i从0开始,用sum累加,如果sum>n,就返回i-1;
3.如果sum=n就返回i
代码
class Solution {
public:
int arrangeCoins(int n) {
int sum=0;
if(n==1)
{
return 1;
}
for(long long i=1;i<2147483648;i++)
{
sum=sum+i;
if(sum>n){
return i-1;
}
if(sum==n){
return i;
}
}
return 0;
}
};
分析
就是差最后一个用例,不知道怎么解决
方法二:公式法
算法思想
1.列出一个一元二次方程,利用公式,直接求解答案是多少x=根号((2*n)+0.25)-0.5
2.对求解答案取整,就是行数
代码
class Solution {
public:
int arrangeCoins(int n) {
return (int) ((sqrt((long long) 2 * n + 0.25) - 0.5));
}
};
方法三:二分法
算法思想
1.x*(x+1)/2=n,所以利用二分查找,如果等式左边的值小于右边。left=mid,当left<right时,继续循环
代码
class Solution {
public:
int arrangeCoins(int n) {
int left = 1, right = n;
while (left < right) {
int mid = (right - left + 1) / 2 + left;
if ((long long) mid * (mid + 1) <= (long long) 2 * n) {
left = mid;
} else {
right = mid - 1;
}
}
return left;
}
};