likes
comments
collection
share

leetcode每日一题系列- 排列硬币-「二分」-「数学公式」

作者站长头像
站长
· 阅读数 59

leetcode-441-排列硬币

[博客链接]

菜🐔的学习之路

[题目链接]

题目链接

[github地址]

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
评论
请登录