【发布时间】:2020-07-06 01:49:14
【问题描述】:
我正在尝试解决 LeetCode.com 上的Arranging Coins:
您总共有 n 个硬币要形成一个阶梯形状,其中每 k 行 必须正好有 k 个硬币。给定 n,找出可以形成的完整楼梯行的总数。 n 是一个非负整数,并且在 32 位有符号整数的范围内。对于 n=5,输出为:2。
基于the solution given,我们可以将问题重新表述为:
找到最大的
k使得k*(k+1)/2<=N
我的不变量(灵感来自this Quora 答案):
我有一个从 L 到 R 的区间,即
a[L]k*(k+1)/2<=N 和a[R]>k*(k+1)/2<=N。然后,在我检查中间的元素 M 之后,我将 L 或 R 设置为 M,保留不变量。
但我不确定我的不变量是否正确:
- 我不确定这是否会给我 k 的
maximum值; - 我应该继续迭代@987654331@ 还是
while(l<=r)?l和r是通常用于迭代的两个指针; - 在我将
mid计算为k*(k+1)/2之后,我应该使用l=mid+1还是l=mid(同样是r=mid-1或r=mid)?
谢谢!
【问题讨论】:
-
公式看不懂有没有质量更好的版本???
-
@YunfeiChen,编辑。谢谢指出!
标签: c++ algorithm binary-search invariants loop-invariant