【剑指offer|图解|二分查找】点名 + 统计目标成绩的出现次数

在这里插入图片描述
🌈个人主页:聆风吟
🔥系列专栏:剑指offer每日一练
🔖少年有梦不应止于心动,更要付诸行动。


文章目录

  • 一. ⛳️点名
    • 1.1 题目
    • 1.2 示例
    • 1.3 限制
    • 1.4 解题思路一
      • c++代码
    • 1.5 解题思路二
      • c++代码
  • 二. ⛳️统计目标成绩的出现次数
    • 1.1 题目
    • 1.2 示例
    • 1.3 限制
    • 1.4 解题思路
      • c++代码
  • 📝结语

一. ⛳️点名

⌈ 在线OJ链接,可以转至此处自行练习 ⌋

1.1 题目

某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组 records。假定仅有一位同学缺席,请返回他的学号。

1.2 示例

输入: records = [0,1,2,3,5]
输出: 4

1.3 限制

  • 1 <= records.length <= 10000

1.4 解题思路一

二分查找
根据题意,数组可以按照以下规则进行划分为两部分:

  • 左子数组:records[i] = i
  • 右子数组:records[i] != i

缺失的数字等于 右子数组的首位元素 对应的索引,因此我们可以使用二分查找右子数组首元素。
在这里插入图片描述

算法执行过程

  1. 初始化 :左边界 l = 0 和 右边界 r = records.size() - 1
  2. 循环二分:当 l <= r 时循环
    • 计算中心点 mid = (l + r) / 2;
    • 如果 records[mid] = mid 说明要查找的值在区间[mid + 1, r] 之间,因此执行 l = mid + 1;
    • 如果 records[mid] != mid 说明要查找的值在区间[l, mid - 1] 之间,因此执行 r = mid - 1;
  3. 返回值:循环跳出时,返回 l 即可。

在这里插入图片描述

c++代码

class Solution {
public:int takeAttendance(vector<int>& records) {int sz = records.size();int l = 0;int r = sz - 1;while(l <= r){int mid = (l + r) >> 1;if(records[mid] == mid) l = mid + 1;else r = mid -1;}return l;
};

1.5 解题思路二

求和做差
有题目可知:
0 ~ n - 1 之间所有同学的学号加在一起,然后减去数组中的每个元素,所得结果即是缺课人学号。
在这里插入图片描述

c++代码

class Solution {
public:int takeAttendance(vector<int>& records) {int sz = records.size();int sum = sz*(sz+1)/2;//使用等差求和公式求全班学号的总和//将全班人的学号 - 数组中的每一个元素for(int i = 0; i < sz; i++){sum -= records[i];}return sum;}
};


二. ⛳️统计目标成绩的出现次数

⌈ 在线OJ链接,可以转至此处自行练习 ⌋

1.1 题目

某班级考试成绩按非严格递增顺序记录于整数数组 scores,请返回目标成绩 target 的出现次数。

1.2 示例

输入: scores = [2, 2, 3, 4, 4, 4, 5, 6, 6, 8], target = 4
输出: 3

1.3 限制

  • 0 <= scores.length <= 105
  • -109 <= scores[i] <= 109
  • scores 是一个非递减数组
  • -109 <= target <= 109

1.4 解题思路

对于已经排好序的数组查找问题,首先我们可以想到是用二分查找。

对于排序数组 scores 中所有数字 target 形成一个窗口,记做窗口的 左 / 右边界 索引分别为 left 和 right,分别对应窗口的左右两边。因此本题求数字 target 出现的次数,就可以转化为:使用二分法分别求出窗口的左边界 left 和 右边界 right,容易得出数字 target 出现的次数 right - left + 1。
在这里插入图片描述


1. 查找右边界:

//查找右边界
while(l < r)
{int mid = (l + r + 1) >> 1;if(scores[mid] <= target) l = mid;else r = mid - 1;
}

在这里插入图片描述

注意

  1. 在查找完右边界后,需要用 scores[right] 判断一下数组中是否含有 target,若不包含则直接提前返回 0,无需继续查找左边界
  2. 记得让指针 l,r 重新回到起点处

2. 查找左边界:

//查找左边界
while(l < r)
{int mid = (l + r) >> 1;if(scores[mid] >= target) r = mid;else l = mid + 1;
}

由于左边界的查找同右边界运行类似,大家可以在下面自己画出图形,调试。

c++代码

class Solution {
public:int countTarget(vector<int>& scores, int target) {int sz = scores.size();int l = 0;int r = sz - 1;// 搜索右边界while(l < r){int mid = (l + r + 1) >> 1;if(scores[mid] <= target) l = mid;else r = mid - 1;}int right = r;// 若数组中无 target ,则提前返回if(r >= 0 && scores[right] != target) return 0;// 搜索左边界l = 0, r = sz - 1;//让指针返回到初始状态while(l < r){int mid = (l + r) >> 1;if(scores[mid] >= target) r = mid;else l = mid + 1;}int left = l;return right - left + 1;}
};


📝结语

     今天的干货分享到这里就结束啦!如果觉得文章还可以的话,希望能给个三连支持一下,聆风吟的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的最大动力!
在这里插入图片描述

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

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

相关文章

开发信的基本要点有哪些?如何撰写开发信?

开发信的关键要素是什么&#xff1f;外贸开发信的写作技巧方法&#xff1f; 开发信是一种至关重要的沟通工具&#xff0c;无论是初创企业还是已经建立的公司&#xff0c;开发信都是与潜在客户、合作伙伴或投资者建立联系的关键步骤。蜂邮将讨论开发信的基本要点&#xff0c;以…

(NeRF学习)3D Gaussian Splatting Instant-NGP环境配置

学习参考&#xff1a; 3D gaussian splatting 安装步骤拆解23.9月3D Gaussian Splatting入门指南【五分钟学会渲染自己的NeRF模型&#xff0c;有手就行&#xff01;】 三维重建instant-ngp环境部署与colmap、ffmpeg的脚本参数使用 一、3D Gaussian Splatting &#xff08;一&…

快看!AI竟然可以这样……

自从ChatGPT诞生之后&#xff0c;还有谁不知道AI的名号吗&#xff1f;我相信只有极少部分人吧。人工智能技术在21世纪粉墨登场&#xff0c;拉开了信息化时代的蓝图&#xff0c;被广泛应用于各个产业&#xff0c;来实现产业赋能&#xff0c;推动了经济社会的快速发展。 5G使用还…

【数据结构】什么是堆?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 堆的概念及结构 堆的定义如下: n个元素的序列{k1,k2,...,kn}当且仅当满足以下关系时,称之为堆. 或 把这个序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个…

基于springBoot + Vue电影售票系统分前后台【完整源码+数据库】

一、项目简介 本项目是一套基于springBoot Vue的电影售票系统&#xff0c;主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目可以直接作为bishe使用。 项目都经过严格调试&#xff0c;确…

<蓝桥杯软件赛>零基础备赛20周--第10周--二分

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…

门窗企业网站建设作用是什么

门窗作为市场重要的组合部分&#xff0c;其应用广泛使得众多商家入局经营&#xff0c;无论大型建筑还是家庭应用&#xff0c;都有较高需求度&#xff0c;尤其对品牌商来说&#xff0c;无论直售还是加盟都可以获得不菲效益。 但对门窗企业来说&#xff0c;也需要解决几个痛点&a…

读写分离如何在业务中落地?

本文我们来探讨读写分离如何在业务中落地。 读写分离是业务开发中常用的技术手段&#xff0c;在面试中也是热点问题&#xff0c;今天我们要讲的是在什么业务场景下需要读写分离&#xff0c;读写分离实现的机制&#xff0c;以及实际生产中应用读写分离要注意的问题。 什么时候…

深入解析Spring Boot集成MyBatis的多种方式

文章目录 1. 引言2. 传统的XML配置方式2.1 引入依赖2.2 配置数据源和MyBatis2.3 编写Mapper接口和XML映射文件2.4 使用Mapper 3. 注解配置方式3.1 引入依赖3.2 配置数据源和MyBatis3.3 编写Mapper接口3.4 使用Mapper 4. MyBatis动态SQL4.1 使用XML配置方式4.2 使用注解配置方式…

Salesforce×阿里云,影响几何?

实际上&#xff0c;从这个视角来看&#xff0c;Salesforce和阿里云的合作也恰在成为着这个市场的一个新催化剂。“期待Salesforce能给中国市场带来一些新的增量&#xff0c;包括对合作伙伴的态度&#xff0c;对产品的态度等等。”一位CRM相关人士告诉我们。 那么&#xff0c;阿…

slurm 23.11.0集群 debian 11.5 安装

slurm 23.11.0集群 debian 11.5 安装 用途 Slurm(Simple Linux Utility for Resource Management&#xff0c; http://slurm.schedmd.com/ )是开源的、具有容错性和高度可扩展的Linux集群超级计算系统资源管理和作业调度系统。超级计算系统可利用Slurm对资源和作业进行管理&a…

【Jmeter】Jmeter基础4-Jmeter元件介绍之监听器

2.4、监听器 监听器主要用于收集、统计、查看和分析结果。 2.4.1、察看结果树 作用&#xff1a;查看取样器请求和响应结果&#xff0c;包括消息头&#xff0c;请求的数据&#xff0c;响应的数据等。一般在调试时才用&#xff0c;在实际运行压测时建议禁用&#xff0c;因为大量…

【NSX-T】6. 搭建NSX-T环境 —— 配置 Segment 网段

目录 6. 配置 SegmentLab 说明6.1 创建 Segment&#xff08;1&#xff09;创建 Web-Segment&#xff08;2&#xff09;创建 App-Segment 和 DB-SegmentApp-SegmentDB-Segment 6.2 验证 Segment&#xff08;1&#xff09;在 NSX Manager中查看&#xff08;2&#xff09;在vSpher…

前端走向未来:真相还是焦虑的贩卖?

目录 一、为什么会出现“前端已死”的言论 二、你如何看待“前端已死” 三、前端技术的未来发展趋势 四、前端人&#xff0c;该如何打好这场职位突围战&#xff1f; 我的其他博客 一、为什么会出现“前端已死”的言论 近来&#xff0c;IT圈内流传着“Java 已死、前端已凉”…

医院污水处理设备远程监控超标报警解决方案

行业背景 近年来&#xff0c;我国医疗机构建设得到了巨大的发展。根据《2022年我国卫生健康事业发展统计公报》&#xff0c;2022年末&#xff0c;全国医疗卫生机构总数达1032918个。截至2022年10月&#xff0c;根据全国排污许可证管理信息平台&#xff0c;共有 13316家医院核发…

修改Docker0和容器的地址

修改Docker0和容器的地址 1. 需求 默认服务器安装完Docker-ce后会给docker0分配172.17.0.1/16地址. 公司新接入一个网段正好与172.17.0.1/16冲突,此时访问这台服务器的容器时就会发生网络不可达. 2. 解决方法 修改/etc/docker/daemon.json 加入一个自定义网段 vim /etc/d…

想要在电脑桌面上使用手机便签怎么操作?

作为一名上班族&#xff0c;我们时常需要在电脑和手机之间同步使用便签&#xff0c;以记录工作、生活中的重要事项。然而&#xff0c;有些时候我们可能更习惯在手机上使用便签&#xff0c;但又希望在电脑桌面上也能够方便地查看和编辑这些便签。那么&#xff0c;如何在电脑桌面…

k8s-8 ingress

ExternalName类型 当集群外的资源往集群内迁移时&#xff0c;地址并不稳定&#xff0c;访问域名或者访问方式等会产生变化&#xff1b; 使用svc的方式来做可以保证不会改变&#xff1a;内部直接访问svc&#xff1b;外部会在dns上加上解析&#xff0c;以确保访问到外部地址。 …

20231214使用WPS将英文SRT字幕的全大写字符转换为首字母大写的小写字幕

20231214使用WPS将英文SRT字幕的全大写字符转换为首字母大写的小写字幕 2023/12/14 13:16 看英文纪录片&#xff0c;发现英文字母是全部大写。 所以需要整理成为小写的字幕【句子的首字符大小&#xff01;】 https://re.talking.1080p.hdtv.x265.aac.mvgroup.org/index.php?t…

【owt-server】清理日志:owt、srs、ffmpeg

运行一段时间后,云主机的磁盘满了owt的日志和 srs的日志比较多。查看日志文件占用: du 通过命令du -h –max-depth=1 *,可以查看当前目录下各文件、文件夹 关闭owt-server dist# ./bin/stop-all.sh root@k8s-master-2K4G:~/p2p/zdsvr-20201229/dist# ./bin/stop-all.sh stopp…