LeetCode 441, 57, 79
目录
- 441. 排列硬币
- 题目链接
- 标签
- 思路
- 代码
- 57. 插入区间
- 题目链接
- 标签
- 思路
- 两个区间的情况
- 对每个区间的处理
- 最终的处理
- 代码
- 79. 单词搜索
- 题目链接
- 标签
- 原理
- 思路
- 代码
- 优化
- 思路
- 代码
441. 排列硬币
题目链接
441. 排列硬币
标签
数学 二分查找
思路
由于本题所返回的 答案在区间 [1, n] 内,并且 答案越大,所需要的硬币越大 (有序),所以采用 二分枚举答案 的思想。
由于要找 最多 的完整阶梯的总行数,所以使用二分法的 前驱 实现,因为一个数的前驱是 最后一个小于该数 的数。不了解二分法的后继与前驱的可以看这篇文章:算法——二分法。
代码
class Solution {public int arrangeCoins(int n) {// 二分枚举答案long left = 1, right = n; // 答案的区间为 [1, n]while (left < right) { // 使用二分法的 前驱 实现long mid = left + (right - left + 1 >> 1); // 猜想答案if (n < sum(mid)) { // 如果 猜想的答案 太大了right = mid - 1; // 则 缩小 猜想的答案} else { // 如果 猜想的答案 太小了 或 猜对了left = mid; // 则 扩大 猜想的答案}}return (int) left;}// 获取 layer 层阶梯 需要的硬币总数private long sum(long layer) {return layer * (layer + 1) / 2;}
}
57. 插入区间
题目链接
57. 插入区间
标签
数组
思路
由于题目中提示 可以不原地修改 intervals,所以可以创建一个 List<int[]> 类型的变量 list,将所有的区间都添加到 list 中,同时 合并重叠的区间,在最后返回 list 转换为 int[][] 的形式。本题的重点在于如何合并区间。
两个区间的情况

如上图,区间 curr 和 区间 new 之间共有 3 中情况:
- 如果
interval[1] < left,则curr在new左边。 - 如果
right < interval[0],则curr在new右边。 - 如果以上两种情况都不满足,并且有
interval[0] < right,则curr与new有交集。注意:此情况包含 c u r r ⊂ n e w curr \subset new curr⊂new、 n e w ⊂ c u r r new \subset curr new⊂curr 和 c u r r = n e w curr = new curr=new 这三种特殊情况。
对每个区间的处理
令 新区间newInterval 的左、右端点分别为 left, right,从区间的集合 intervals 中取出单个区间 interval,其左、右端点分别为 interval[0], interval[1],则对于 新区间 new 和 当前选取的区间 curr,根据不同情况可分为以下三种处理方式:
- 当
curr在new左边时,直接将 当前区间curr加入到list中。 - 当
curr在new右边时,将 新区间new加入到list中,并把 当前区间curr当作 新区间new。 - 当
curr与new有交集时,将 当前区间curr合并到 新区间new中,此时新区间的端点值需要被更新,左端点更新为 较小 的左端点,右端点更新为 较大 的右端点。
最终的处理
这种处理方式会导致 最后的新区间 没有被加入到 list 中,以下,针对 倒数第二个区间curr 和 新区间new 做如下讨论,证明 最后的新区间 没有被加入到 list 中:
- 当
curr在new左边时,只将 倒数第二个区间curr加入到list中,而没有将new加入到list中。 - 当
curr在new右边时,只将 新区间new加入到list中,而没有将被看作 新区间new的倒数第二个区间curr加入到list中。 - 当
curr与new有交集时,只是更新了 新区间new的左、右端点,而没有将其加入到list中。
综上所述,最后的新区间 确实没有被加入到 list 中,所以在返回结果之前得先把 最后的新区间 加入到 list 中。
代码
class Solution {public int[][] insert(int[][] intervals, int[] newInterval) {if (intervals.length == 0){ // 如果 intervals 为空return new int[][]{newInterval}; // 则将 newInterval 作为唯一的区间返回}int left = newInterval[0], right = newInterval[1]; // left, right 分别为 合并后的新区间的 左端点 和 右端点List<int[]> list = new ArrayList<>(intervals.length);for (int[] interval : intervals) {if (right < interval[0]) { // 如果 当前区间的左端点 大于 新区间的右端点,即 curr 在 new 右边// 注意这里不能直接写 list.add(newInterval)// 因为新区间可能经过合并,此时左、右端点可能就与原来不同了list.add(new int[]{left, right}); // 则将新区间加入 list// 将 当前区间 当作 新区间left = interval[0];right = interval[1];} else if (interval[1] < left) { // 如果 当前区间的右端点 小于 新区间的左端点,即 curr 在 new 左边list.add(interval); // 将当前区间加入 list} else { // 当前区间与新区间有交集,合并它们left = Math.min(left, interval[0]); // 取 左端点 的较小值right = Math.max(right, interval[1]); // 取 右端点 的较大值}}// 将 最后的新区间 加入 listlist.add(new int[]{left, right});return list.toArray(new int[list.size()][]); // 将 List<int[]> 转为 int[][]}
}
79. 单词搜索
题目链接
79. 单词搜索
标签
数组 字符串 回溯 矩阵
原理
思路
本题可以使用 深度优先搜索 的思想:以矩阵中每个元素作为 word 的起始字符,搜索合适的字符串,如果能找到合适的字符串,则返回 true。步骤如下:
- 如果要遍历一个字符,那么它得满足以下
3个条件,如果任意一个不成立,则返回false;否则继续匹配。- 当前字符在矩阵
board中 - 当前字符没有被遍历过
- 当前字符与本轮搜索要匹配的
word中的字符相等
- 当前字符在矩阵
- 如果当前字符匹配的是
word中的最后一个字符,则可以返回true,代表找到合适的字符串了;否则继续匹配。 - 标记当前字符已被遍历过了。
- 分别向上下左右搜索下一个字符,如果其中有一个方向匹配成功,则直接返回
false。 - 取消遍历过当前字符的标记,清除本次搜索对下一次搜索的影响。
- 如果能到这一步,则说明没有匹配成功,返回
false。
由于 同一个单元格内的字母不允许被重复使用,所以 在搜索时得记录每个元素是否遍历过,可以使用 boolean[][] 来记录 board 中的每个元素是否遍历过。
代码
class Solution {public boolean exist(char[][] board, String word) {// 对成员变量进行赋值ROW = board.length;COL = board[0].length;this.vis = new boolean[ROW][COL];this.board = board;this.word = word.toCharArray();// 以矩阵中每个元素作为 word 的起始字符,搜索合适的字符串for (int r = 0; r < ROW; r++) {for (int c = 0; c < COL; c++) {if (dfs(r, c, 0)) { // 如果能找到合适的字符串return true; // 则返回 true}}}return false; // 找不到合适的字符串,返回 false}// (r, c) 指向 board 中的字符,curr 指向 word 中的字符private boolean dfs(int r, int c, int curr) {if (!(r >= 0 && r < ROW && c >= 0 && c < COL) // 如果 (r, c) 指向的元素在矩阵外|| vis[r][c] // 或 (r, c) 指向的元素已被遍历过|| board[r][c] != word[curr]) { // 或 字符匹配失败return false; // 则返回 false} else if (curr == word.length - 1) { // 当前字符匹配成功,如果当前字符匹配的是最后一个字符return true; // 则返回 true}vis[r][c] = true; // 标记遍历过 (r, c) 指向的元素for (int k = 0; k < 4; k++) { // 枚举四个方向int kr = r + dir[k][0], kc = c + dir[k][1]; // (kr, kc) 指向待遍历的元素if (dfs(kr, kc, curr + 1)) { // 如果后面的字符都匹配成功了return true; // 则返回 true}}vis[r][c] = false; // 取消 遍历过 (r, c) 指向元素的标记return false; // 匹配失败,返回 false}private int ROW; // 矩阵的行数private int COL; // 矩阵的列数private char[][] board; // 使用成员变量保存 boardprivate char[] word; // 使用成员变量保存 wordprivate boolean[][] vis; // 判断某个元素是否遍历过private int[][] dir = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; // 方向数组,分别为 向右、向下、向左、向上
}
优化
思路
上面的代码运行起来比较慢,主要有两个优化点:
- 不使用方向数组
dir,而是一个一个地将四个方向写出来。 - 标记是否遍历过某个元素时可以不使用
boolean[][] vis,而是将board的字符变为一个与英文字母不相关的字符——'\0',然后再将其还原为原本的字母,这样在判断时就将vis[r][c]合并到 匹配字符的操作board[r][c] != word[curr]中,这样做可以减少时间的浪费。
代码
class Solution {public boolean exist(char[][] board, String word) {// 对成员变量进行赋值ROW = board.length;COL = board[0].length;this.board = board;this.word = word.toCharArray();// 以矩阵中每个元素作为 word 的起始字符,搜索合适的字符串for (int r = 0; r < ROW; r++) {for (int c = 0; c < COL; c++) {if (dfs(r, c, 0)) { // 如果能找到合适的字符串return true; // 则返回 true}}}return false; // 找不到合适的字符串,返回 false}// (r, c) 指向 board 中的字符,curr 指向 word 中的字符private boolean dfs(int r, int c, int curr) {if (!(r >= 0 && r < ROW && c >= 0 && c < COL) // 如果 (r, c) 指向的元素在矩阵外=|| board[r][c] != word[curr]) { // 或 字符匹配失败return false; // 则返回 false} else if (curr == word.length - 1) { // 当前字符匹配成功,如果当前字符匹配的是最后一个字符return true; // 则返回 true}board[r][c] = '\0'; // 标记遍历过 (r, c) 指向的元素boolean res = dfs(r, c + 1, curr + 1) // 向右|| dfs(r + 1, c, curr + 1) // 向下|| dfs(r - 1, c, curr + 1) // 向左|| dfs(r, c - 1, curr + 1); // 向上 分别向四个方向搜索能否找到合适的字符串board[r][c] = word[curr]; // 取消 遍历过 (r, c) 指向元素的标记return res; // 返回 分别向四个方向搜索能否找到合适的字符串}private int ROW; // 矩阵的行数private int COL; // 矩阵的列数private char[][] board; // 使用成员变量保存 boardprivate char[] word; // 使用成员变量保存 word
}
相关文章:
LeetCode 441, 57, 79
目录 441. 排列硬币题目链接标签思路代码 57. 插入区间题目链接标签思路两个区间的情况对每个区间的处理最终的处理 代码 79. 单词搜索题目链接标签原理思路代码 优化思路代码 441. 排列硬币 题目链接 441. 排列硬币 标签 数学 二分查找 思路 由于本题所返回的 答案在区间…...
【排序 - 插入排序 和 希尔排序】
插入排序(Insertion Sort)是一种简单直观的排序算法,它的工作原理是逐步构建有序序列。在排序过程中,它将未排序的元素逐个插入到已排序的部分中,从而在每次插入时扩展已排序序列的长度。 原理介绍 插入排序的基本思…...
Java使用 MyBatis-Plus 的 OR
Java使用 MyBatis-Plus 的 OR 一、前言1. 简介2. OR 查询2.1 基础 OR 查询2.2 使用 Lambda 表达式简化 二、总结 一、前言 学习使用 MyBatis-Plus 的 OR 及高级语句是提升数据库操作效率和灵活性的关键步骤。MyBatis-Plus 是 MyBatis 的增强工具包,提供了许多便捷的…...
[Linux]CentOS软件的安装
一、Linux 软件包管理器 yum 1.Linux安装软件的方式 在linux中安装软件常用的有三种方式: 源代码安装(我们还需要进行编译运行后才可以,很麻烦) rpm安装(Linux的安装包,需要下载一些rpm包,但是…...
4000厂商默认账号密码、默认登录凭证汇总.pdf
获取方式: 链接:https://pan.baidu.com/s/1F8ho42HTQhebKURWWVW1BQ?pwdy2u5 提取码:y2u5...
RK3568笔记三十六:LED驱动开发(设备树)
若该文为原创文章,转载请注明原文出处。 记录使用设备树编写一个简单的 LED 灯驱动程序 一、编程思路 程序编写的主要内容为添加 LED 灯的设备树节点、在驱动程序中使用 of 函数获取设备节点中的 属性,编写测试应用程序。 • 首先向设备树添加 LED 设备…...
AC修炼计划(AtCoder Regular Contest 180) A~C
A - ABA and BAB A - ABA and BAB (atcoder.jp) 这道题我一开始想复杂了,一直在想怎么dp,没注意到其实是个很简单的规律题。 我们可以发现我们住需要统计一下类似ABABA这样不同字母相互交替的所有子段的长度,而每个字段的的情况有ÿ…...
云计算练习题
第一题:每周日晚上11点59分需要将/data目录打包压缩到/mnt目录下并以时间命名 #crontab -e 59 23 * * 7 /bin/tar czvf /mnt/date %F-data.tar.gz /data 59 23 * * 7 /bin/tar czvf /mnt/date %T.tar.gz /data 第二题:查找出系统中/application目录下所有…...
《战甲神兵》开发者报告:游戏崩溃问题80%发生在Intel可超频酷睿i9处理器上——酷睿i7 K系列CPU也表现出高崩溃率
在Intel持续面临第13代和第14代CPU崩溃问题的背景下,近日,《战甲神兵》(Warframe)的开发者们于7月9日披露了游戏崩溃的统计数据,并描述了诊断该问题的过程。根据开发团队的说法,一名未进行超频且使用全新PC的员工,即便…...
Postman下载及使用说明
Postman使用说明 Postman是什么? Postman是一款接口对接工具【接口测试工具】 接口(前端接口)是什么? 前端发送的请求普遍被称为接口 通常有网页的uri参数格式json/key-value请求方式post/get响应请求的格式json 接…...
什么是im即时通讯?WorkPlus im即时通讯私有化部署安全可控
IM即时通讯是Instant Messaging的缩写,指的是一种实时的、即时的电子信息交流方式,也被称为即时通讯。它通过互联网和移动通信网络,使用户能够及时交换文本消息、语音通话、视频通话、文件共享等信息。而WorkPlus im即时通讯私有化部署则提供…...
hnust 1794: 机器翻译
hnust 1794: 机器翻译 题目描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存…...
AI人工智能开源大模型生态体系分析
人工智能开源大模型生态体系研究 "人工智能开源大模型生态体系研究报告v1.0"揭示,AI(A)的飞速发展依赖于三大核心:数据、算法和算力。这一理念已得到业界广泛认同,三者兼备才能推动AI的壮大发展。随着AI大模型的扩大与普及…...
ArkTS学习笔记_封装复用之@Styles装饰器
ArkTS学习笔记_封装复用之Styles装饰器 背景: 在开发中,如果每个组件的样式都需要单独设置,就会出现大量代码在进行重复样式设置,虽然可以复制粘贴,但为了代码简洁性和后续方便维护,给出的思路是ÿ…...
根据vue学习react
react的函数式组件与vue2是很像的 一、基础类似点 1、组件下拥有一个根节点,vue2是template,react是幽灵标签<> 2、vue2是{{}}以及v-model,react的绑定是{} 3、vue2编译html是v-html,react是{},并且react的jsx中…...
Hi3861 OpenHarmony嵌入式应用入门--HTTPD
httpd 是 Apache HTTP Server 的守护进程名称,Apache HTTP Server 是一种广泛使用的开源网页服务器软件。 本项目是从LwIP中抽取的HTTP服务器代码; Hi3861 SDK中已经包含了一份预编译的lwip,但没有开启HTTP服务器功能(静态库无法…...
MICS2024|少样本学习、多模态技术以及大语言模型在医学图像处理领域的研究进展|24-07-14
小罗碎碎念 本期推文主题 今天的会议很多主题都集中在大模型、多模态这两个方面,很明显,这两个方向都是目前的研究热点。 所以,我这一期推文会先简单的分析一下秦文健(中科院)和史淼晶(同济大学)…...
ConfigMap-secrets-静态pod
一.ConfigMap 1.概述 ConfigMap资源,简称CM资源,它生成的键值对数据,存储在ETCD数据库中 应用场景:主要是对应用程序的配置 pod通过env变量引入ConfigMap,或者通过数据卷挂载volume的方式引入ConfigMap资源 官方解释…...
SQL Error: 1406, SQLState: 22001
SQL错误代码1406和SQLState 22001通常表示“列数据过长”错误。这意味着尝试插入或更新列中的值,但该值的长度超过了该列允许的最大长度。 解决此问题的几个步骤: 检查列长度: 确定引起错误的列。检查数据库架构中该列允许的最大长度。 验证…...
【密码学基础】基于LWE(Learning with Errors)的全同态加密方案
学习资源: 全同态加密I:理论与基础(上海交通大学 郁昱老师) 全同态加密II:全同态加密的理论与构造(Xiang Xie老师) 现在第二代(如BGV和BFV)和第三代全同态加密方案都是基…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
