441. 排列硬币[简单]

601 阅读1分钟

问题

你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。

给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。

image.png

思路一

第i行有i个硬币,这样每摆第i行就用掉i个硬币,到最后无法满足了,就返回。

    public int arrangeCoins(int n) {
        int i = 1;
        while (n > 0) {
            n = n - i;
            i++;
        }
        // 有可能恰好,有可能不足
        return n == 0 ? i - 1 : i - 2;
    }

上面的代码可以提交成功。

思路二

其实这是一个数学问题,是一个等差数列。

相当于多少行后,求个和能到达n。

class Solution {
    public int arrangeCoins(int n) {
        long low = 1, high = n, mid = 0;
        while (low <= high) {
            mid = (low + high) / 2;
            long res = mid * (1 + mid) / 2;
            if (res == n) {
                return (int) mid;
            } else if (res < n) {
                low = mid + 1;
            } else {
                high = mid - 1;
            }
        }
        // 在找第一个求和大于n的位置,相当于在往右找,所以应该返回high
        return (int) high;
    }
}