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

news2024/12/27 9:30:00

一、题目描述

你总共有 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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2252189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据查找文件夹里Excel、Word文件

我经常需要处理大量的Excel文件&#xff0c;为了解决查找数据时的困扰&#xff0c;我编写了一个小工具。这个工具可以搜索文件夹下的所有Excel文件&#xff0c;只需输入你想查找的字符串&#xff0c;它就会告诉你该字符串出现在哪个Excel文件的哪个表格中。 下载地址&#xff…

每天下午16:20达梦数据库干什么?

家里有达梦的朋友注意了&#xff0c;如果您用的是试用版&#xff0c;那么通常1年后数据库就不允许使用了&#xff0c;这是因为缺少正式许可&#xff0c;通常保存在 $DM_HOME/bin/dm.key 文件中 这个1年的时间从软件发布日期算&#xff0c;例如&#xff1a;从官方网站下载的 dm…

rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable

解决方法&#xff1a; 1、先测量pcf8563电源电压&#xff0c;是否满足要求。 2、pcf8563首次操作。第一次读取pcf8563的时间&#xff0c;未初始化&#xff0c;非法&#xff0c;芯片门槛电压检测配置不合理。使用hwclock命令写入一次&#xff0c;即可解决。 hwclock -f /dev/…

SpringBoot 整合 Avro 与 Kafka

优质博文&#xff1a;IT-BLOG-CN 【需求】&#xff1a;生产者发送数据至 kafka 序列化使用 Avro&#xff0c;消费者通过 Avro 进行反序列化&#xff0c;并将数据通过 MyBatisPlus 存入数据库。 一、环境介绍 【1】Apache Avro 1.8&#xff1b;【2】Spring Kafka 1.2&#xf…

【leetcode100】矩阵置零

1、题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用原地算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 2、初始思路 2…

进程状态的学习

进程状态就是 task_struct 内的一个整数 状态间是可以进行转化的 运行&#xff1a; 每一个框都是进程的task_struct&#xff0c;都有唯一的pcb和pid来标识它的唯一性 让CPU选择一个进程去运行&#xff0c;本质是选择一个进程的PCB去运行&#xff0c;task_struct里一定有内存指…

PDF版地形图矢量出现的问题

项目描述&#xff1a;已建风电场道路测绘项目&#xff0c;收集到的数据为PDF版本的地形图&#xff0c;图上标注了项目竣工时期的现状&#xff0c;之后项目对施工区域进行了复垦恢复地貌&#xff0c;现阶段需要准确的知道实际复垦修复之后的道路及其它临时用地的面积 解决方法&…

Ubuntu20.04离线安装全教程(包括DellR940重置Raid 5、安装Ubuntu、设置root、安装nvidia英伟达显卡驱动及设置防火墙白名单)

本文记录重装Ubuntu20.04的所有记录&#xff0c;从服务器磁盘阵列重新排列、Ubuntu 20.04系统安装、配置root权限、安装Nvidia显卡驱动以及设置防火墙白名单的全部操作。 每一部分参考的博客的出处会放置于段落末尾&#xff0c;表示感谢&#xff01; 一、重置服务器磁盘阵列&…

华为新手机和支付宝碰一下 带来更便捷支付体验

支付正在变的更简单。 11月26日&#xff0c;华为新品发布会引起众多关注。发布会上&#xff0c;华为常务董事余承东专门提到&#xff0c;华为Mate 70和Mate X6折叠屏手机的“独门支付秘技”——“碰一下”&#xff0c;并且表示经过华为和支付宝的共同优化&#xff0c;使用“碰…

手机中的核心SOC是什么?

大家好&#xff0c;我是山羊君Goat。 常常听说CPU&#xff0c;中央处理器等等的&#xff0c;它是一个电脑或单片机系统的核心&#xff0c;但是对于SOC可能相比于CPU了解的人没有那么广泛。 所以SOC是什么&#xff1f; SOC全称是System on Chip&#xff0c;就是片上系统&#…

理解字母形状,从而获得含义

英文字母&#xff0c;都是象形符号&#xff0c;所以&#xff0c;理解其形象&#xff0c;所象之形&#xff0c;是一项重要的工作&#xff0c;和非常有意义事情。也是我们快速记住大量单词&#xff0c;将单词从底层逻辑开始理清&#xff0c;融会贯通扩展记忆容量的重要办法之一。…

新型大语言模型的预训练与后训练范式,阿里Qwen

前言&#xff1a;大型语言模型&#xff08;LLMs&#xff09;的发展历程可以说是非常长&#xff0c;从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初&#xff0c;LLM的训练过程只关注预训练&#xff0c;但后来逐步扩展到了包括预训练和后训练在内的完整…

爬虫专栏第一篇:深入探索爬虫世界:基础原理、类型特点与规范要点全解析

本专栏会对爬虫进行从0开始的讲解,每一步都十分的细致,如果你感兴趣希望多多点赞收藏关注支持 简介:文章对爬虫展开多方面剖析。起始于爬虫的基本概念,即依特定规则在网络抓取信息的程序或脚本,在搜索引擎信息提取上作用显著。阐述其于大数据背景下可助力获取并处理分析数…

LocalDateTime序列化(跟redis有关)

使用过 没成功&#xff0c;序列化后是[2024 11 10 17 22 20]差不多是这样&#xff0c; 反序列化后就是&#xff1a; [ 2024 11 10.... ] 可能是我漏了什么 这是序列化后的&#xff1a; 反序列化后&#xff1a; 方法&#xff08;加序列化和反序列化注解&#xff09;&…

UE5 打包报错 Unknown structure 的解决方法

在虚幻引擎5.5 打包报错如下&#xff1a; UATHelper: 打包 (Windows): LogInit: Display: LogProperty: Error: FStructProperty::Serialize Loading: Property ‘StructProperty /Game/Components/HitReactionComponent/Blueprints/BI_ReactionInterface.BI_ReactionInterface…

webrtc ios h264 硬编解码

webrtc ios h264 硬编解码 一 ios 系统支持 从ios8开始&#xff0c;苹果公司开放了硬解码和硬编码API&#xff08;即 VideoToolbox.framework API&#xff09; 二 主要api 1 主要解码函数 VTDecompressionSessionCreate // 创建解码 session VTDecompressionSession…

【大模型】深度解析 NLP 模型5大评估指标及 应用案例:从 BLEU、ROUGE、PPL 到METEOR、BERTScore

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;无论是机器翻译、文本生成&#xff0c;还是问答系统开发&#xff0c;模型性能评估指标始终是开发者绕不开的工具。BLEU、ROUGE、PPL&#xff08;困惑度&#xff09;、METEOR 和 BERTScore 是五个最具代表性的指标&am…

idea 自动导包,并且禁止自动导 *(java.io.*)

自动导包配置 进入 idea 设置&#xff0c;可以按下图所示寻找位置&#xff0c;也可以直接输入 auto import 快速定位到配置。 Add unambiguous imports on the fly&#xff1a;自动帮我们优化导入的包Optimize imports on the fly&#xff1a;自动去掉一些没有用到的包 禁止导…

Mac安装及合规无限使用Beyond Compare

文章目录 Beyond CompareBeyond Compare简介Beyond Compare安装Beyond Compare到期后继续免费使用 Beyond Compare Beyond Compare简介 Beyond Compare 是一款由 Scooter Software 开发的文件和文件夹比较工具。它主要用于对比两个文件或文件夹之间的差异&#xff0c;并支持文…

Navcat连接sqlserver报错:[IM002][Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序 (0)

Navcat连接sqlserver报错&#xff1a;[IM002][Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序 (0) 原因&#xff1a;navicat没有找到sqlserver驱动 解决&#xff1a;安装sqlserver驱动&#xff0c;下载后双击安装&#xff0c;安装完重新连接就可以了…