问题
你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。
给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。
思路一
第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;
}
}