阶梯排列硬币

题意:

你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。

给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。

示例 1:
在这里插入图片描述

输入:n = 5
输出:2
解释:因为第三行不完整,所以返回 2 。

示例 2:
在这里插入图片描述

输入:n = 8
输出:3
解释:因为第四行不完整,所以返回 3 。

提示:

  • 1 <= n <= 231 - 1

题目来源: https://leetcode.cn/problems/arranging-coins/description/

解题方法:

方法一:迭代递减

//迭代递减
function arrangeCoins($n) {
    for($i = 1; $i <= $n; $i++){
        $n -= $i;
        if($n == 0 || $n < $i+1){
            return $i;
        }
    }
}

方法二:二分法(利用)
在这里插入图片描述

// 等差数列{an}的通项公式为:an=a1+(n-1)d。前n项和公式为:Sn=n*a1+n(n-1)d/2或Sn=n(a1+an)/2,d为公差
function arrangeCoins($n) {
    if($n == 1 || $n == 2){
        return 1;
    }
    $start = 1;
    $end = $n;
    while($start < $end){
        $mid = $start + intval(($end - $start + 1) / 2);
        $sum = ($mid * ($mid + 1)) / 2; //Sn=n(a1+an)/2 => n=$mid, a1=1, an=$mid
        if($sum > $n){
            $end = $mid - 1;
        }else{
            $start = $mid;
        }
    }
    return $start;
}

方法三:数学,一元二次方程求根
在这里插入图片描述

在这里插入图片描述

// 数学,一元二次方程求根
function arrangeCoins($n) {
    return intval((pow(8 * $n + 1, 0.5) - 1) / 2);
}

参考:
作者:力扣官方题解
链接:https://leetcode.cn/problems/arranging-coins/solutions/1038396/pai-lie-ying-bi-by-leetcode-solution-w52c/
来源:力扣(LeetCode)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值