LeetCode 35, 242, 994

目录

  • 35. 搜索插入位置
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 242. 有效的字母异位词
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 994. 腐烂的橘子
    • 题目链接
    • 标签
    • 思路
    • 代码

35. 搜索插入位置

题目链接

35. 搜索插入位置

标签

数组 二分查找

思路

本题与 704. 二分查找 十分相似,只不过本题在找不到 target 时不返回 -1,而是返回 target 应该插入的位置。

可以思考一下当找不到值时,左、右指针 left, right 指向哪里。结论是 左指针left指向第一个大于target的元素,右指针right指向最后一个小于target的元素

例如对于nums = [1, 2, 3, 4, 5, 7, 8], target = 6

开始left = 0, right = 6, mid = 3,发现此时target > nums[mid],将左指针left移动到mid + 1的位置;
此时left = 4, right = 6, mid = 5,发现此时target < nums[mid],将右指针right移动到mid - 1的位置;
此时left = 4, right = 4, mid = 4,发现此时target > nums[mid],将左指针left移动到mid + 1的位置;
此时left = 5, right = 4,有left > right,退出循环。

发现left = 5nums中第一个大于target的元素,而right = 4nums中最后一个小于target的元素,而left = 5恰好是这个元素应该插入的位置,所以 在找不到值时,返回left作为待插入索引

代码

class Solution {public int searchInsert(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + (right - left >> 1);if (target < nums[mid]) {right = mid - 1; // 在左子区间查询} else if (target > nums[mid]) {left = mid + 1; // 在右子区间查询} else {return mid;}}return left; // 在找不到值时,返回 left 作为待插入索引}
}

242. 有效的字母异位词

题目链接

242. 有效的字母异位词

标签

哈希表 字符串 排序

思路

st 中每个字符出现的次数都相同,则称 st 互为字母异位词。理解了这句话就会做本题了,这句话意味着对于 st,不需要关心它们的字符顺序,只需要关心它们每个字符出现的次数,所以可以通过 先统计两个字符串中每个字符出现的次数,然后比较统计的结果是否完全一致 的方法来解决本题。

统计字符出现的次数有两种方法,一种是使用Map,键为字符,值为字符出现的次数;另一种是使用int[],索引为字符(字符最多也就128个,并且 字符的底层就是数字),索引指向的元素为字符出现的次数。使用int[]Map要快很多,所以本题解使用int[]

一般来说,使用int[]时得自己构建 字符与索引之间的映射。例如:

  1. 如果统计的是全部的大写字符,则对于大写字符ch,它在统计数组中的索引为ch - 'A',这个统计数组的长度为26;
  2. 如果统计的是全部的小写字符,则对于小写字符ch,它在统计数组中的索引为ch - 'a',这个统计数组的长度为26;
  3. 如果统计的是全部字符,则对于字符ch,它在统计数组中的索引为ch - '\0'(由于'\0' == 0,所以这里的索引可以简写为ch),这个统计数组的长度为128。

代码

class Solution {public boolean isAnagram(String s, String t) {int[] sCnt = count(s); // 统计s中的字符出现次数int[] tCnt = count(t); // 统计t中的字符出现次数for (int i = 0; i < sCnt.length; i++) {if (sCnt[i] != tCnt[i]) { // 如果有一个字符的出现次数不一样return false; // 则不是字母异位词,返回 false}}return true; // 每个字符的出现情况都一样,返回 true}// 统计字符串str中的字符出现次数private int[] count(String str) {int[] cnt = new int[26]; // s 和 t 仅包含小写字母,共26个for (char ch : str.toCharArray()) {cnt[ch - 'a']++;}return cnt;}
}

994. 腐烂的橘子

题目链接

994. 腐烂的橘子

标签

广度优先搜索 数组 矩阵

思路

本题是一道 模拟题,可以采用 模拟橘子腐烂过程 的方法来计算感染的时间:感染之前先记录新鲜橘子的数量,只有在新鲜橘子数量大于0的情况下才进行感染,每轮感染对腐烂橘子上下左右的新鲜橘子进行感染,然后统计本轮感染的橘子的数量,如果本轮感染没有感染任何橘子,则说明新鲜橘子不可能被感染完,返回 -1;否则就将本轮感染的橘子从新鲜橘子中移除,并让时间加1分钟。当新鲜橘子数量为0时,返回时间即可。

模拟有一个难点:如何统计每轮感染的橘子数?可以在感染时将橘子的状态设置为0, 1, 2除外的任意一种状态,然后在统计时遍历整个网格,对于状态为自定义状态的橘子,将其状态改为2,并让统计结果加一。

代码

class Solution {public int orangesRotting(int[][] grid) {int time = 0; // 记录感染的时间int rest = countFresh(grid); // 剩余新鲜橘子的数量while (rest > 0) {// 对腐烂橘子上下左右的新鲜橘子进行感染for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[i].length; j++) {if (grid[i][j] == 2) {infect(grid, i, j);}}}int infected = countInfect(grid); // 统计本轮感染的橘子数量if (infected == 0) { // 如果本轮感染的橘子数量为0,则说明不可能感染完所有橘子return -1;}rest -= infected; // 将 本轮感染的橘子 从 剩余新鲜的橘子中 移除time++; // 时间过了1分钟}return time;}// 感染上下左右的橘子,将感染的橘子状态设置为-2private void infect(int[][] grid, int i, int j) {int m = grid.length, n = grid[0].length;for (int k = 0; k < 4; k++) {int ki = i + dir[k][0], kj = j + dir[k][1];if (ki >= 0 && ki < m && kj >= 0 && kj < n // 如果这个橘子在矩阵中&& grid[ki][kj] == 1) { // 并且是新鲜橘子grid[ki][kj] = -2; // 则将其感染}}}// 统计本轮感染的橘子数量,统计完毕后将感染橘子的状态置为2private int countInfect(int[][] grid) {int cnt = 0;for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[i].length; j++) {if (grid[i][j] == -2) {cnt++;grid[i][j] = 2;}}}return cnt;}// 统计初始的新鲜橘子数量private int countFresh(int[][] grid) {int cnt = 0;for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[i].length; j++) {if (grid[i][j] == 1) {cnt++;}}}return cnt;}private int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; // 方向数组,分别为 向右、向下、向左、向上
}

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

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

相关文章

llama2阅读: logits是什么?

Logits是一个在深度学习中&#xff0c;几乎一直都有的概念&#xff0c;它意味着模型unnormalized final scores. 然后你可以通过softmax得到模型针对你class的概率分布。 而在llama2的代码中&#xff0c;同样有logits的使用&#xff0c;那么针对llama2&#xff0c;logits的作用…

centos7.9安装redis

安装redis mkdir redis sudo yum install epel-release -y sudo yum update -y sudo yum install redis -y sudo systemctl start redis sudo systemctl enable redis redis-cli ping sudo yum install gcc make -y wget http://download.redis.io/releases/redis-6.0.9.tar.…

CF构造题

1900-2100 1.Arithmancy (Easy) 注意题目要求唯一对应&#xff0c;也就是不能存在两种选择使得这两种选择的"power"都是一样的 Ans && Conclusion

零知识证明;电路,编码,多项式是什么;零知识验证流程

目录 零知识证明怎么应用到神经网络模型不变的验证中 应用背景 应用过程 举例说明 技术挑战与解决方案 实际应用案例 零知识中,电路,编码,多项式是什么 电路(Circuit) 编码(Coding) 多项式(Polynomial) 零知识中涉及的概念 零知识验证流程 零知识证明怎么…

Sequelize 操作 MySQL 数据库

安装 npm install --save sequelize安装驱动程序&#xff1a; npm install --save mysql2连接到数据库 要连接到数据库,必须创建一个 Sequelize 实例. 这可以通过将连接参数分别传递到 Sequelize 构造函数或通过传递一个连接 URI 来完成&#xff1a; const {Sequelize} re…

ActiViz实战:vtkMath中的陷阱

文章目录 一、vtkMath简介二、vtkMath在C#中的使用三、C#版本vtkMath的陷阱四、vtkPlane同理五、总结一、vtkMath简介 vtkMath是VTK(Visualization Toolkit)库中的一个核心类,它提供了一系列用于执行基本数学运算和高级数学计算的静态方法。这个类主要用于矢量和矩阵运算,…

Canal架构以及使用规范

Canal架构以及使用规范 一、Canal的作用 相关文档&#xff1a;GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 MySQL主备复制原理 MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events&#xff0c;可…

Gitlab代码管理工具安装配置

前言&#xff1a; 没有真正的证书与域名建议使用httpip的方式在内网使用&#xff0c;不建议使用假的域名地址 一、安装前配置 #更改主机域名 hostnamectl set-hostname gitlab.dome.com bash #配置hosts 底部添加下面内容 vim /etc/hosts ############################ ip gi…

Stowaway搭建隧道打CFS内网靶场

目录 渗透带出主机阶段 先把我们的服务端上传到kali ​先把我们的客户端上传到目标机 客户端去连接我们的kali机端口去上线 出现admin&#xff0c;上线成功 detail相当于msf的sessions​ 和msf差不多功能&#xff0c;但是我们用它主要是搞隧道代理 抓发的 ​开启socks…

Pytorch中分类回归常用的损失和优化器

Pytorch中分类回归常用的损失和优化器 在机器学习和深度学习中&#xff0c;分类任务和预测任务&#xff08;回归任务&#xff09;有不同的常用损失函数和优化器。下面将详细介绍这些常用的损失函数和优化器。 分类任务 1. 损失函数 交叉熵损失&#xff08;Cross-Entropy Los…

07-7.1.1 查找的基本概念

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

Elasticsearch 自定义评分和脚本评分

在Elasticsearch中&#xff0c;默认的评分机制&#xff08;如BM25算法&#xff09;在大多数情况下能够提供良好的搜索结果排序。然而&#xff0c;在某些特定场景下&#xff0c;我们可能需要根据业务需求对搜索结果进行更精细化的排序。这时&#xff0c;Elasticsearch提供了自定…

C++ 进程间通信举例

C++进程通信 C++ 中的进程间通信(IPC)可以通过多种方式实现,包括管道、消息队列、共享内存和信号等。以下是每种方法的详细示例和说明。 总结 上述示例展示了 C++ 中几种常见的进程间通信方法。根据不同的应用场景,可以选择合适的 IPC 机制: 管道(Pipe):适用于父子进…

序列化是什么 为什么要序列化 何时序列化

目录 序列化是什么 为什么要用序列化 什么时候用序列化 序列化是什么 序列化(Serialization)是指将数据结构或对象的状态信息转换为可以存储或传输的形式的过程,比如将Java对象转化成字节流(二进制流)。这个状态信息包括对象的字段(包括基本类型和对象引用)以及对象的类…

Android | RxJava 中的调度器(Schedulers)的主要作用是什么?

RxJava 中的调度器&#xff08;Schedulers&#xff09;的设计主要是为了帮助开发者有效地管理和控制异步操作的执行线程&#xff0c;以提高应用程序的响应性和用户体验。虽然防止卡顿是其中一个重要的方面&#xff0c;但调度器的作用不仅限于此。 主要作用包括&#xff1a; 响…

[终端安全]-4 移动终端之硬件架构安全

1 移动终端硬件架构 上图图展示了典型移动终端硬件架构&#xff0c;包括应用处理器&#xff08;AP&#xff09;、基带处理器&#xff08;BP&#xff09;以及各类共享组件和外设&#xff0c;所有组件通过AXI总线&#xff08;和APB桥&#xff09;连接在一起。以下分别介绍基于整…

HTML+CSS+JavaScript入门学习

目录 1. 前言2. HTML2.1 HTML简介2.2 HTML标签 3. CSS3.1 CSS知识整理及总结3.2 CSS之flex布局 4. JavaScript4.1 JavaScript知识整理及总结1-基础篇4.2 JavaScript知识整理及总结2-进阶篇 1. 前言 本文主要采用转载的形式&#xff0c;偶尔发现了一个比较不错的博客站点&#…

WPS+Python爬取百度之星排名

运行效果 手动拉取 https://www.matiji.net/exam/contest/contestdetail/146 如果手动查找&#xff0c;那么只能通过翻页的方式&#xff0c;每页10行&#xff08;外加一行自己&#xff09;。 爬取效果预览 本脚本爬取了个人排名和高校排名&#xff0c;可以借助WPS或MS Offi…

华为OSPF配置DR和BDR与指定DR

基础配置 <Huawei>sys #进入配置模式 Enter system view, return user view with CtrlZ. [Huawei]un in en #关闭报文弹窗 Info: Information center is disabled. [Huawei]sys R1 #设备名更改为R1 [R1]int g0/0/0 …

调度系统揭秘(下):调度算法与架构设计

文章目录 一、调度算法1.1、广度优先:1.2、深度优先1.3、总结广度优先搜索&#xff08;BFS&#xff09;深度优先搜索&#xff08;DFS&#xff09; 二、架构设计2.1、Master/Slave架构优劣分析 2.2、Leader架构优劣分析 2.3、总结 一、调度算法 在调度系统中&#xff0c;调度算…