[更文刷题] 441. 排列硬币

100 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

一、题目描述:

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

二、思路分析:

法1:

思路:

假设n个硬币可以排成等差k行(第K行个数不够),那么累加前k-1行的硬币的和为sum

然后n-sum就是最后一行的硬币个数,那么最后一行的硬币个数必然小于等于前一行的个数

并且sum也必然小于等于总硬币个数n

法2:

思路:

如下,第一行所以为1,第二行索引为2......也就是索引号就等于该行的硬币数量(最后一行除外)

当索引指向第二行时,此时总数n为减去第一行后的数量

然后索引指向第三行,此时总数n为减去第二行后的数量

然后索引指向第四行,此时总数n为减去第三行后的数量

当发现索引号和该行的硬币数量不相等时,那么说明遍历到头了,前一行就是要求的行数

三、AC 代码:

class Solution:
    def arrangeCoins(self, n: int) -> int:
        return int(((8 * n + 1) ** 0.5 - 1) // 2)

范文参考:

【宫水三叶】一题双解 :「数学」&「二分」 - 排列硬币 - 力扣(LeetCode)

二分 python - 排列硬币 - 力扣(LeetCode)