日新计划441. 排列硬币

103 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第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,公差为1且长度为mid的等差数列的和为Smid=mid×(mid+1)2S_{mid} = \frac{mid\times (mid + 1)}2,逐次比较SmidS_{mid}与n的大小,移动左右指针。
  • 最后返回左或右指针停留的位置,即所求。

三、AC 代码:

/**
 * @param {number} n
 * @return {number}
 */
var arrangeCoins = function(n) {
    let left = 0 , right = n
    while(left < right) {
        const mid = left + Math.floor((right - left +1) / 2)
        if((mid*(mid+1)/2) <= n) {
            left = mid
        } else {
            right = mid - 1
        }
    }
    return left

};

范文参考:

【track & traning】 数学思路求解,性能高效接近100 - 排列硬币 - 力扣(LeetCode)

直接求k(k+1) /2 = n的解,然后取整即可,一行代码,0ms,击败100% - 排列硬币 - 力扣(LeetCode)

[441. 排列硬币] 贡献一个全新的题解思路:位运算 双O(1)算法 - 排列硬币 - 力扣(LeetCode)