Description
Example 1
Example 2
Solution 1(C++)
class Solution {
public:
int arrangeCoins(int n) {
int digit=1;
int count=0;
while(n >= 0){
n -= digit;
digit++;
count++;
}
return count-1;
}
};
Solution 2(C++)
class Solution {
public:
int arrangeCoins(int n) {
return floor(-0.5+sqrt((double)2*n+0.25));
}
};
算法分析
这道题比较简单,而且数学背景比较浓重。解法一比较容易想出来,理解难度低,但是时间复杂度会高。解法二说白了,就是一一道数学问题。解释可参考:C++ 1 line code。
解释如下:
1+2+3+…+x = n
-> (1+x)x/2 = n
-> x^2+x = 2n
-> x^2+x+1/4 = 2n +1/4
-> (x+1/2)^2 = 2n +1/4
-> (x+0.5) = sqrt(2n+0.25)
-> x = -0.5 + sqrt(2n+0.25)
我使用放缩的方法,越放越大···所以说嘛,我总觉得我不太适合搞数学。没办法,还是要学,记住然后积累,然后多多体会。
程序分析
sqrt()函数,求平方根。floor()函数,向下取整。ceil()函数,向上取整。