持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情
一、题目描述:
你总共有
n枚硬币,并计划将它们按阶梯状排列。对于一个由k行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。
示例 1:
输入:n = 5
输出:2
解释:因为第三行不完整,所以返回 2 。
示例 2:
输入: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)