题目描述
题干:
你总共有 n 枚硬币,并计划将它们按阶梯状排列
对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币
阶梯的最后一行 可能 是不完整的。
给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。
示例 1:
输入:n = 5
输出:2
解释:因为第三行不完整,所以返回 2 。
示例 2:
输入:n = 8
输出:3
解释:因为第四行不完整,所以返回 3 。
题解思路
返回硬币可以完整填满的阶梯数,看到阶梯首先想到的就是类似杨辉三角形采用遍历
记录每层的数量和之前的数目和,显然这种暴力模型会超时,再优化想到二分的方法
因为按照台阶来排列,n/2就是它的高度,但是完整的长度还是得按照等差数列公式
如果我们解这个公式还可以用解直接返回答案,这就是数学的魅力
正确代码
public int arrangeCoins(int n) {
int left = 1, right = n;
while (left < right) {
int mid = left + (right - left) / 2;
if ((long) mid * (mid + 1) <= (long) 2 * n) {
left = mid;
} else {
right = mid;
}
}
return left;
}
public int arrangeCoins1(int n) {
return (int) ((Math.sqrt((long) 8 * n + 1) - 1) / 2);
}
总结
数学模型的建立都伴随着总结的公式出现,所以以后遇到要先思考模型的规律
如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见