题目描述:
你总共有n枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。
给你一个数字n ,计算并返回可形成 完整阶梯行 的总行数。
我的思路分析:
因为要形成k行组合的阶梯,且第i行正好有i个硬币,那么就遍历每一行,第一行是1个硬币,第二行两个。
class Solution:
def arrangeCoins(self, n: int) -> int:
i = 1
while n:
n = n - i
if n < i + 1:
break
i += 1
return i
但是这样的话,时间复杂度为O(n)。
在来看看官方解法:
根据等差数列求和公式可知,前 k 个完整阶梯行所需的硬币数量为
total = k(K+1)/2
注意:
等差数列求和公式,求前n项和为 n(a1+an) /2,即等差数列第一项与第n项之和乘n除2.
因此,可以通过二分查找计算 n 枚硬币可形成的完整阶梯行的总行数。
因为 1≤n≤2^31−1,所以 n 枚硬币至少可以组成 1 个完整阶梯行,至多可以组成 n 个完整阶梯行(在n=1 时得到)。
class Solution:
def arrangeCoins(self, n: int) -> int:
left,right = 1,n
while left<right:
mid = (left+right+1)//2
if mid * (mid+1) <= 2*n:
left = mid
else:
right = mid - 1
return left
这里的官方解法,作者目前也不懂。