LeetCode 441. 排列硬币

105 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

441. 排列硬币

你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。

给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。

 

示例 1:

image.png

输入:n = 5
输出:2
解释:因为第三行不完整,所以返回 2 。

示例 2:

image.png

输入:n = 8
输出:3
解释:因为第四行不完整,所以返回 3 。

提示:

  • 1 <= n <= 2^31 - 1

二、思路分析:

简单的一元二次方程 假设 最后结果为 k 行

那么 k 行 有 k * (k + 1)/2 个

得到 k * (k + 1)/2 小于等于 n

解 一元二次 方程 k * (k + 1)/2 = n

最后的结果 √(2n + 0.25) - 0.5 然后向下取整就得到了 能支持的最大行数

三、AC 代码:

class Solution {
    func arrangeCoins(_ n: Int) -> Int {        
        return Int(floor(sqrt(CGFloat(2 * n) + 0.25) - 0.5))
    }
}

四、总结:

还是数学强大啊

范文参考:

排列硬币 - 排列硬币 - 力扣(LeetCode) (leetcode-cn.com)

logn 二分法一遍过 - 排列硬币 - 力扣(LeetCode) (leetcode-cn.com)