解法一 Math O(1)
利用等差数列的性质,n=(1+x)*x/2 --> x^2 + x - 2n = 0
a=1 b=1 c=-2n
--> x = (-1+sqrt(1+8n))/2 (用求根公式求值)
class Solution {
public:
int arrangeCoins(int n) {
return (int) ((-1+sqrt(1+8*(long)n))/2);
}
};
解法二 Binary Search O(n logn)
class Solution {
public:
int arrangeCoins(int n) {
if(n<=1) return n;
long l=1, r=n;
while(l<r){
long mid = l+(r-l)/2;
long cur = (1+mid)*mid/2;
if(n==cur) return mid;
else if(n>cur) l = mid+1;
else r=mid;
}
return r-1;
}
};
解法三 O(n)
class Solution {
public:
int arrangeCoins(int n) {
if(n<=1) return n;
int cur = n;
int i=0;
for(;i<n;i++){
cur -= i;
if(cur<0) break;
}
return i-1;
}
};