二分查找系列
排列硬币
你总共有
n
枚硬币,并计划将它们按阶梯状排列。对于一个由k
行组成的阶梯,其第i
行必须正好有i
枚硬币。阶梯的最后一行 可能 是不完整的。给你一个数字
n
,计算并返回可形成 完整阶梯行 的总行数。示例 1:
输入:n = 5 输出:2 解释:因为第三行不完整,所以返回 2 。示例 2:
输入:n = 8 输出:3 解释:因为第四行不完整,所以返回 3 。
方法一: 通过mid 向上取整缩小查找范围
class Solution {
public int arrangeCoins(int n) {
int l = 1, r = n;
while (l < r) {
int mid = l + (r - l + 1) / 2;
if ((long) mid * (mid + 1) <= (long) 2 * n) {
l = mid;
} else {
r = mid - 1;
}
}
return l;
}
}
方法二: 利用边界缩小查找范围
class Solution {
public int arrangeCoins(int n) {
int l = 1, r = n;
int num = 1;
while (l < r) {
int mid = l + (r - l) / 2;
if (n >= (long) mid * (mid + 1) / 2) {
num = mid;
l = mid + 1;
} else {
r = mid;
}
}
return num;
}
}