Java教程

LeetCode——441. 排列硬币(Java)

本文主要是介绍LeetCode——441. 排列硬币(Java),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

题目描述

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

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

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

题解思路

返回硬币可以完整填满的阶梯数,看到阶梯首先想到的就是类似杨辉三角形采用遍历

记录每层的数量和之前的数目和,显然这种暴力模型会超时,再优化想到二分的方法

因为按照台阶来排列,n/2就是它的高度,但是完整的长度还是得按照等差数列公式

如果我们解这个公式还可以用解直接返回答案,这就是数学的魅力

正确代码

    public int arrangeCoins(int n) {
        int left = 1, right = n;
        while (left < right) {
            int mid = left + (right - left) / 2;

            if ((long) mid * (mid + 1) <= (long) 2 * n) {
                left = mid;
            } else {
                right = mid;
            }
        }
        return left;
    }

    public int arrangeCoins1(int n) {
        return (int) ((Math.sqrt((long) 8 * n + 1) - 1) / 2);
    }

总结

数学模型的建立都伴随着总结的公式出现,所以以后遇到要先思考模型的规律

如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见
这篇关于LeetCode——441. 排列硬币(Java)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!