总共有 n 枚硬币,将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。
给定一个数字 n,找出可形成完整阶梯行的总行数。
n 是一个非负整数,并且在 32 位有符号整型的范围内。
暴力算法:
public static int arrangeCoins(int n) {for (int i = 1; i <= n; i++) {n = n - i;if (n <= i) {return i;}}return 0;
}
二分查找法:
public static int arrangeCoins2(int n) {int low = 0, high = n;while (low <= high) {int mid = low + (high - low) / 2;int cost = ((mid + 1) * mid) / 2; // 到 mid 行总共耗费了多少枚硬币if (cost == n) {return mid;} else if (cost > n) {high = mid - 1;} else {low = mid + 1;}}return high;
}
牛顿迭代:
private static double sqrt(double x, int n) {// ((1 + x) * x) / 2 = n -》 2n = x + x * x -》 x = (2n - x) / x -》 x + (2n - x) / x = 2xdouble res = (x + (2 * n - x) / x) / 2;if (res == x) {return x;} else {return sqrt(res, n);}
}