leetcode每日一题系列- 排列硬币-「二分」-「数学公式」
leetcode-441-排列硬币
[博客链接]
[题目链接]
[github地址]
[题目描述]
你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。
给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。
示例 1:
输入:n = 5
输出:2
解释:因为第三行不完整,所以返回 2 。
示例 2:
输入:n = 8
输出:3
解释:因为第四行不完整,所以返回 3 。
提示:
- 1 <= n <= 2312^{31}231 - 1
思路一:二分查找
- 根据二分查找0-n满足条件的解返回即可
- 简单题还是简单题的手机写的代码风格有点乱
public int arrangeCoins(int n) {
long l =1, r=n;
while(l<r){
long mid = (l - r +1)/2+r;
if(mid*(mid-1)/2>n) r=mid-1;
else l=mid;
}
return l*(l+1)/2==n?(int)l:(int)l-1;
}
- 时间复杂度O(lgn)
- 空间复杂度O(1)
思路二:数学公式
- 这种题当然要搬出来神仙的数学了
- 求根公式我就不写了
public int arrangeCoins(int n) {
return (int)((Math.sqrt(1 + 8.0 * n) - 1) / 2);
}
- 时间复杂度O(1)
- 空间复杂度O(1)
转载自:https://juejin.cn/post/7017625237005008932