首页 > 其他分享 >LeetCode题练习与总结:排列硬币--441

LeetCode题练习与总结:排列硬币--441

时间:2024-12-02 22:31:52浏览次数:8  
标签:二分 right -- 441 mid 查找 复杂度 LeetCode left

一、题目描述

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 2^31 - 1

二、解题思路

这个问题可以通过数学方法解决。首先,我们知道每一行的硬币数是递增的,第 i 行有 i 枚硬币。因此,如果我们要排列 k 行,总共需要的硬币数是 1 + 2 + 3 + … + k = k * (k + 1) / 2。

我们的目标是找到一个最大的 k,使得 k * (k + 1) / 2 <= n。我们可以通过以下步骤找到这个 k:

  1. 使用二分查找法,在 1 到 n 之间查找合适的 k。
  2. 对于每个中间值 mid,计算 mid * (mid + 1) / 2。
  3. 如果这个值小于或等于 n,则尝试更大的值(右半部分)。
  4. 如果这个值大于 n,则尝试更小的值(左半部分)。
  5. 当左边界超过右边界时,停止搜索,此时的左边界减一就是答案。

三、具体代码

class Solution {
    public int arrangeCoins(int n) {
        int left = 1, right = n;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            long coinsUsed = (long) mid * (mid + 1) / 2;
            if (coinsUsed == n) {
                return mid; // 找到了一个完全匹配的阶梯
            } else if (coinsUsed < n) {
                left = mid + 1; // 尝试更大的 k
            } else {
                right = mid - 1; // 尝试更小的 k
            }
        }
        return right; // 当循环结束时,right 是最后一个满足条件的 k
    }
}

这段代码使用了二分查找来高效地找到最大的 k,使得 k * (k + 1) / 2 <= n。在每次迭代中,我们计算了中间值 mid 所需要的硬币数,并根据比较结果调整搜索范围。最后,当循环结束时,right 指向的就是最大的 k。

四、时间复杂度和空间复杂度

1. 时间复杂度

该算法使用了二分查找的方法来找到最大的 k,使得 k * (k + 1) / 2 <= n。在二分查找中,每次迭代都将搜索范围减半,因此算法的时间复杂度与迭代的次数有关。

设 n 为输入的硬币数量,每次迭代搜索范围减半,直到搜索范围为 1。二分查找的迭代次数 T 可以通过以下公式表示:

T = log2(n)

因此,算法的时间复杂度为 O(log n),即对数时间复杂度。

2. 空间复杂度

空间复杂度是指算法在执行过程中临时占用存储空间的大小。在上述代码中,除了输入参数 n 和几个整型变量 left、right、mid、coinsUsed 之外,没有使用额外的数据结构来存储数据。

这些变量占用的空间是常数级别的,与输入规模 n 无关。因此,算法的空间复杂度为 O(1),即常数空间复杂度。

五、总结知识点

  • 二分查找算法

    • 二分查找是一种在有序数组中查找特定元素的搜索算法,其时间复杂度为 O(log n)。
    • 代码通过 left 和 right 指针来维护当前搜索的范围,并在每次迭代中通过计算 mid 来缩小搜索范围。
  • 整数溢出问题

    • 在计算 coinsUsed 时,使用了 (long) 强制类型转换,以避免在乘法操作中发生整数溢出。这是因为 mid * (mid + 1) 可能会超出 int 类型的最大值。
  • 算术运算

    • 代码中使用了算术公式 mid * (mid + 1) / 2 来计算前 mid 项的和,这是等差数列求和的一个特例。
  • 循环控制

    • 使用 while 循环来持续进行二分查找,直到 left 超过 right
  • 条件判断

    • 使用 if-else 语句来根据 coinsUsed 与 n 的比较结果来调整搜索范围。
  • 整数除法

    • 在计算 mid 时,使用了整数除法 left + (right - left) / 2 来避免直接使用 (left + right) / 2 可能导致的整数溢出。
  • 边界条件处理

    • 在循环结束后,返回 right 作为结果,这是因为当 coinsUsed 大于 n 时,我们需要返回最后一个满足条件的 k,即 right

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

标签:二分,right,--,441,mid,查找,复杂度,LeetCode,left
From: https://blog.csdn.net/weixin_62860386/article/details/144176029

相关文章

  • 开发嵌入式系统 这五种微处理器该怎么选?从零基础到精通,收藏这篇就够了!
    本文介绍了嵌入式系统中常用的五种微处理器类型:微处理器单元(MPU)、微控制器(MCU)、数字信号处理器(DSP)、现场可编程逻辑门阵列(FPGA)和单片机(SBC)。文章详细阐述了每种处理器的功能、优点、缺点以及选择建议,并列出了一些精选的微处理器产品,供读者参考。任何一个电子系统都需要一......
  • YOLOv11改进,YOLOv11添加SAConv可切换空洞卷积,二次创新C3k2结构
    摘要作者提出的技术结合了递归特征金字塔和可切换空洞卷积,通过强化多尺度特征学习和自适应的空洞卷积,显著提升了目标检测的效果。理论介绍空洞卷积(AtrousConvolution)是一种可以在卷积操作中插入“空洞”来扩大感受野的技术,更有效地捕捉到图像中的大范围上下文信息......
  • 【雷达】对萨德系统ANTPY-2雷达的威力范围仿真计算【含Matlab源码 9707期】
    ......
  • 4.5 将关系字段添加到模型
    在Odoo模型中添加关系字段的全面解析在Odoo开发中,模型之间的关系处理至关重要。关系字段能够有效地建立起不同模型之间的联系,使数据的组织和交互更加合理、高效。今天,我们就深入探讨如何在Odoo模型中添加关系字段。一、关系字段类型概述Odoo模型中的关系字段主要有三种类......
  • kube-proxy的iptables工作模式分析
    系列文章目录iptables基础知识文章目录系列文章目录前言一、kube-proxy介绍1、kube-proxy三种工作模式2、iptables中k8s相关的链二、kube-proxy的iptables模式剖析1.集群内部通过clusterIP访问到pod的流程1.1.流程分析2.从外部访问内部serviceclusterIP后端pod的流......
  • 16、指针
    指针是C语言编程灵魂,但是也不要神话它,掌握住指针的实质很重要。1、指针地址空间        指针:指针变量 用来存储内存地址编号。        地址:内存会按照字节进行编号,一个字节就有一个编号。                  一般地址表示用十六进制 ......
  • 「Java进阶」数据结构与算法全攻略:从基础理论到实战应用
    「Java进阶」数据结构与算法全攻略:从基础理论到实战应用目录第1章绪论1.1数据结构的基础概念1.2数据结构的内容1.3算法1.4算法描述1.5算法性能评价1.5.1算法的时间性能分析1.5.2算法的空间性能分析1.5.3算法性能选择1.6数据结构与Java语言表示......
  • Y20030041 java+mysql基于微信小程序的阅读器的设计与实现 源代码 配置 文档
    基于微信小程序的阅读器1.项目描述2.目的和意义3.项目功能结构4.界面展示5.源码获取1.项目描述当计算机在人们生活的各个领域迅速曼延之时,人们获取信息的方式也更加的直接迅速,网络化使信息领域变得更为广泛,在也没有了时间和空间的限制。人们获取信息大部分是通过网......
  • 「Java实战」贪心算法VS穷举法:从理论解析到案例实战,全面掌握算法精髓
    「Java实战」贪心算法VS穷举法:从理论解析到案例实战,全面掌握算法精髓目录引言项目概述技术栈贪心算法详解穷举法详解广播覆盖问题问题描述贪心算法解决方案穷举法解决方案钱币找零问题问题描述贪心算法解决方案穷举法解决方案代码示例Maven依赖配置运行和测试结......
  • 6张图详解计算机网络知识点,从零基础到精通,收藏这篇就够了!
    一、计算机网络概述1.1计算机网络的分类按照网络的作用范围:广域网(WAN)、城域网(MAN)、局域网(LAN);按照网络使用者:公用网络、专用网络。1.2计算机网络的层次结构TCP/IP四层模型与OSI体系结构对比:1.3层次结构设计的基本原则各层之间是相互独立的;每一层需要有足够的......