题目链接
牛顿迭代公式:
class Solution {
public int arrangeCoins(int n) {
// return arrangeCoins1(n);
return arrangeCoins2(n);
// return arrangeCoins3(n);
}
// 1.迭代
public int arrangeCoins1(int n) {
int num = 1;
while(num <= n) {
n = n - num;
num ++;
}
if(num == n) return n;
return num-1;
}
// 2.二分查找(因为不满足的行数一定是小于n的,所以。。), 前x项和为:(1+x)*(x/2)
public int arrangeCoins2(int n) { // int类型的范围
int left = 1,right = n;
while(left <= right) {
int mid = (right - left)/2 + left;
long num = (long)(mid+1)*mid;
if(num == (long)2*n) {
return mid;
} else if(num > (long)2*n) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return left-1;
}
// 3.牛顿迭代, 1804289383过不去,会发生栈溢出
public int arrangeCoins3(int n) {
if(n == 0) return 0;
return (int)sqrt(n,n);
}
private double sqrt(double x, int n) {
double res = (x + (2*n - x)/x)/2;
if(res == x) {
return res;
} else {
return sqrt(res,n);
}
}
}