总共有 n 枚硬币,将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。
    给定一个数字 n,找出可形成完整阶梯行的总行数。
    n 是一个非负整数,并且在32位有符号整型的范围内

    解法1:迭代
    从第一行开始排列,排完一列、计算剩余硬币数,排第二列,直至剩余硬币数小于或等于行数

    1. public static int arrangeCoins(int n) {
    2. for (int i = 1; i <= n; i++) {
    3. n = n - i;
    4. if (n <= i) {
    5. return i;
    6. }
    7. }
    8. return 0;
    9. }

    解法2:二分查找
    假设能排 n 行,计算 n 行需要多少硬币数,如果大于 n,则排 n/2行,再计算硬币数和 n 的大小关系

    1. public static int arrangeCoins2(int n) {
    2. int low = 0;
    3. int high = n;
    4. while (low <= high) {
    5. long mid = ((high - low) / 2) + low;
    6. long cost = ((mid + 1) * mid) / 2;
    7. if (cost == n) {
    8. return (int) mid;
    9. } else if (cost > n) {
    10. high = (int) mid - 1;
    11. } else {
    12. low = (int) mid + 1;
    13. }
    14. }
    15. return high;
    16. }

    解法3:牛顿迭代
    使用牛顿迭代求平方根,(x + n/x)/2
    假设能排 x 行则 1 + 2 + 3 + …+ x = n,即 x(x+1)/2 = n 推导出 x = 2n - x

    1. public static double sqrts(double x, int n) {
    2. double res = (x + (((2 * n) - x) / x)) / 2;
    3. if (res == x) {
    4. return x;
    5. } else {
    6. return sqrts(res, n);
    7. }
    8. }