题目链接
解析: 需要注意数的范围,int型整数的范围加法,乘法会导致超范围
solution:
1.采用加法,long long型
class Solution {
public:
int arrangeCoins(int n) {
if(n==0) return 0;
long long sum=0;
for(int i=1;i<=n;i++)
{
sum = sum+i;
if(sum==n)
return i;
else
if(sum>n)
return i-1;
}
return 0;
}
};
2.采用乘法转化为double型
class Solution {
public:
int arrangeCoins(int n) {
if(n==0) return 0;
double k;
for(int i=1;i<=n;i++)
{
k = 0.5*i*(1+i);
if(k==n) return i;
else
if(k>n) return i-1;
}
return 0;
}
};
3.高效率方法,二分法求解
class Solution {
public:
int arrangeCoins(int n) {
if(n<=1) return n;
int low = 1;
int high = n;
while(low<high)
{
int mid = low+(high-low)/2;
if(0.5*mid*(1+mid) > n)
high =mid;
else
if(0.5*mid*(1+mid)<n)
{
low = mid+1;
}
else
return mid;
}
return low-1;
}
};