算法练习:二分查找

目录

  • 1. 朴素二分查找
  • 2. 在排序数组中查找元素的第一个和最后一个位置
  • 3. 搜索插入位置
  • 4. x的平方根
  • 5. 山脉数组的峰值索引
  • 6. 寻找峰值
  • 7. 寻找旋转排序数组中的最小值
  • 8. 点名

1. 朴素二分查找

  1. 题目信息:
    在这里插入图片描述
  2. 题目链接:
    二分查找
  3. 二分查找的使用前提为数据具有"二段性",在二分时,并不一定要进行2等分(1/3,1/4…)
  4. 二分查找的时间复杂度:O( l o g N log^N logN)

在这里插入图片描述

  1. 求mid的算法优化(原算法有溢出风险)

在这里插入图片描述

class Solution 
{
public:int search(vector<int>& nums, int target) {int right = nums.size() - 1;int left = 0;while(right >= left){//此种算法存在溢出风险//int mid = (right + left) / 2;int mid = (right - left) / 2 + left;if(nums[mid] > target){right = mid - 1;}if(nums[mid] < target){left = mid + 1;}if(nums[mid] == target){return mid;}}return -1;}
};

2. 在排序数组中查找元素的第一个和最后一个位置

  1. 题目信息:
    在这里插入图片描述
  2. 题目链接:
    在排序数组查找元素的第一个与最后一个位置
  3. 思路:向符合条件位置不断推进

在这里插入图片描述

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {int right = nums.size() - 1;int left = 0;vector<int> count(2,-1);//数据为空,特殊处理if(nums.size() == 0){return count;}//左端点while(left < right){//落到左区间int mid = left + (right - left) / 2;if(nums[mid] >= target){right = mid;}if(nums[mid] < target){left = mid + 1;}}if(nums[left] == target){count[0] = left;}right = nums.size() - 1;left = 0;//右端点while(left < right){//落到右区间int mid = left + (right - left + 1) / 2;if(nums[mid] > target){right = mid - 1;}if(nums[mid] <= target){left = mid;}}if(nums[left] == target){count[1] = left;}return count;}
};

3. 搜索插入位置

  1. 题目信息:
    在这里插入图片描述
  2. 题目链接:
    搜索插入位置
  3. 思路:取大,右区间的左边界
class Solution 
{
public:int searchInsert(vector<int>& nums, int target) {int left = 0;int right = nums.size();while(left < right){//小于,大于等于int mid = left + (right - left) / 2;if(nums[mid] < target){left = mid + 1;}if(nums[mid] >= target){right = mid;}}return left;}
};

4. x的平方根

  1. 题目信息:
    在这里插入图片描述
  2. 题目链接:
    x的平方根
  3. 思路:暴力解法的优化,左区间的右边界,二段性
class Solution 
{
public:int mySqrt(int x) {if(x < 1){return 0;}int left = 1;int right = x;while(left < right){//当left从0开始时,left + 1可能会溢出long long mid = left + (right - left + 1) / 2;//防止溢出if(mid * mid <= x){left = mid;}if(mid * mid > x){right = mid - 1;}}return left;}
};

5. 山脉数组的峰值索引

  1. 题目信息:
    在这里插入图片描述
  2. 题目链接:
    山脉数组的峰值索引
  3. 思路:二分法,左区间右边界

在这里插入图片描述

class Solution 
{
public:int peakIndexInMountainArray(vector<int>& nums) {//左区间,右边界int left = 0;int right = nums.size() - 1;while(left < right){int mid = left + (right - left + 1) / 2;if(nums[mid] > nums[mid - 1]){left = mid;}if(nums[mid] < nums[mid - 1]){right = mid - 1;}}return left;}
};
  1. 右区间的左边界

在这里插入图片描述

class Solution 
{
public:int peakIndexInMountainArray(vector<int>& nums) {//右区间,左边界int left = 0;int right = nums.size() - 1;while(left < right){int mid = left + (right - left) / 2;if(nums[mid] < nums[mid + 1]){left = mid + 1;}if(nums[mid] > nums[mid + 1]){right = mid;}}return left;}
};

6. 寻找峰值

  1. 题目信息:
    在这里插入图片描述
  2. 题目链接:
    寻找峰值
  3. 思路:二段性,右区间的左边界,不足三个数特殊化处理

在这里插入图片描述

class Solution 
{
public:int findPeakElement(vector<int>& nums) {int left = 0;int right = nums.size() - 1;//特殊情况//数组值小于3if (nums.size() < 2){return 0;}if (nums.size() < 3){return nums[0] > nums[1] ? 0 : 1;}//右区间的左边界while (left < right){int mid = left + (right - left) / 2;if (nums[mid] < nums[mid + 1]){left = mid + 1;}if (nums[mid] > nums[mid + 1]){right = mid;}}return left;}
};

7. 寻找旋转排序数组中的最小值

  1. 题目信息:
    在这里插入图片描述
  2. 题目链接:
    寻找寻转排序数组中的最小值
  3. 思路:右区间,左边界
class Solution 
{
public:int findMin(vector<int>& nums) {//二段性,右区间,左边界int right = nums.size() - 1;int left = 0;while(left < right){int mid = left + (right - left) / 2;if(nums[mid] > nums[right]){left = mid + 1;}if(nums[mid] < nums[right]){right = mid;}}return nums[left];}
};

8. 点名

  1. 题目信息:
    在这里插入图片描述
  2. 题目链接:
    点名
  3. 思路:(多解法,考察知识广度)
    <1>二分法:右区间的左边界,学号等于下标,学号大于下标,边界问题!
    <2> 哈希表法:时间复杂度O(n),空间复杂度O(n)
    <3> 异或法
    <4> 等差数列求和
    <5> 暴力遍历法
class Solution {
public:int takeAttendance(vector<int>& records) {int left = 0;int right = records.size() - 1;while(left < right){int mid = left + (right - left) / 2;if(records[mid] == mid){left = mid + 1;}if(records[mid] > mid){right = mid;}}//边界问题,n-1个元素,n个学生,必定有一人缺席,缺席为学号最后一位的学生if(left == records.size() - 1 && left == records[left]){left++;}return left;}
};
  1. 等差数列
class Solution 
{
public:int takeAttendance(vector<int>& records) {//等差数列求和,首项加末项乘以项数除以2int sum = ((0 + records.size()) * (records.size() + 1)) / 2;for(int i = 0; i < records.size(); i++){sum -= records[i];}return sum;}
};
  1. 哈希表
class Solution 
{
public:int takeAttendance(vector<int>& records) {//哈希表法int n = records.size() + 1;int* hash = (int*)malloc(n * sizeof(int));//单位字节memset(hash, 0, n * sizeof(int));int i = 0;for(i = 0; i < records.size(); i++){hash[records[i]]++;}for(i = 0; i < n; i++){if(hash[i] == 0){break;}}return i;}
};
  1. 暴力遍历
class Solution 
{
public:int takeAttendance(vector<int>& records) {//暴力遍历int cur = 0;while(cur < records.size()){if(cur != records[cur]){break;}cur++;}if(cur == records.size() - 1 && records[cur] == cur){cur++;}return cur;}
};
  1. 异或法
class Solution 
{
public:int takeAttendance(vector<int>& records){//异或法int sum = 0;for(int i = 0; i < records.size() + 1; i++){sum ^= i;}for(int i = 0; i < records.size(); i++){sum ^= records[i];}return sum;}
};

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

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

相关文章

人脸相关数据集(检测,活体,关键点,表情等等)

参考&#xff1a; 【笔记】人脸处理相关数据集 - 知乎

【Vue】首屏加载优化

文章目录 1. 使用路由懒加载2. 使用异步组件3. 精灵图雪碧图4. 使用webp格式图片5. 添加loading效果6. 事先设置图片宽高7. 配置webpack8. 利用CDN加速资源9. 延迟加载不重要的资源10. 服务器端渲染 1. 使用路由懒加载 首屏进入时只加载首屏相关路由&#xff0c;其他路由实现懒…

掌握高级设计原则:Java中的过滤器模式解析与实战演练,构建灵活且可扩展的系统架构

过滤器模式是一种结构型设计模式&#xff0c;它允许开发者使用不同的标准来过滤一组对象&#xff0c;并通过逻辑运算以解耦的方式将它们联系起来。 过滤器模式的核心在于提供了一个处理对象的机制&#xff0c;这个机制可以根据一个或多个标准来决定哪些对象应该被接受、哪些应…

解析KafkaConsumer类的神奇之道

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 解析KafkaConsumer类的神奇之道 前言KafkaConsumer双线程设计主线程&#xff08;消费线程&#xff09;&#xff1a;心跳线程&#xff1a;示例代码&#xff1a; KafkaConsumer线程不安全线程安全的替代…

jetson nano——编译一些包的网址导航,pyside2,qt(持续更新)

目录 1.PySide2下载地址2.tesserocr下载地址3.Qt下载地址4.OpenSSL官网5.latex编译器下载地址5.1MikTex5.2TeX Live 1.PySide2下载地址 https://download.qt.io/official_releases/QtForPython/pyside2/ 如下图&#xff1a; 2.tesserocr下载地址 https://github.com/simonflue…

JavaWeb-CSS

一、CSS简介 CSS 是一门语言&#xff0c;用于控制网页表现 CSS(Cascading Style Sheet):层叠样式表 W3C标准&#xff1a;网页主要由三部分组成 结构&#xff1a;HTML 表现&#xff1a;CSS 行为&#xff1a;JavaScript 二、CSS导入方式 CSS导入HTML有三种方式&#xff1…

PTA冰岛人

作者 陈越 单位 浙江大学 2018年世界杯&#xff0c;冰岛队因1:1平了强大的阿根廷队而一战成名。好事者发现冰岛人的名字后面似乎都有个“松”&#xff08;son&#xff09;&#xff0c;于是有网友科普如下&#xff1a; 冰岛人沿用的是维京人古老的父系姓制&#xff0c;孩子的姓…

行业突破!四信实现低延时摄像头弱网状态100ms以内实时传输

随着人工智能、大数据、区块链等技术在城市中快速发展&#xff0c;人们日常生活中已经离不开网络的支撑&#xff0c;而实现“人与人”、“人与物”及“物与物”之间高速连接应用的“时延”&#xff0c;是网络支撑中最重要的存在。 以城市生活例子为例&#xff0c;当网络延时出现…

week07day02(powerbi)

一. 透视列 1. 选择一列&#xff0c;然后再转换中选择透视列&#xff0c;被选择的这一列就会变成 列名 2. 只能选择一列&#xff0c;不能同时选择多列 3. 透视表是二维表&#xff0c;数值匹配不上会用 null值 替代。 4. 透视列中存在高级选项&#xff0c;根据所需选择相应功…

通过日志恢复sql server数据库

在SQL Server中&#xff0c;通过日志恢复数据库是一个精细的过程&#xff0c;主要用于在数据库出现错误、数据丢失或需要回滚到特定时间点时恢复数据。以下是一般步骤概述&#xff1a; 设置恢复模式&#xff1a; 首先&#xff0c;数据库必须配置为“完整恢复模式”或“大容量…

【Miniconda】Linux系统中 .condarc 配置文件的位置一般在哪里

【Miniconda】Linux系统中 .condarc 配置文件的位置一般在哪里 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到…

3. ElasticSearch搜索技术深入与聚合查询实战

1. ES分词器详解 1.1 基本概念 分词器官方称之为文本分析器&#xff0c;顾名思义&#xff0c;是对文本进行分析处理的一种手段&#xff0c;基本处理逻辑为按照预先制定的分词规则&#xff0c;把原始文档分割成若干更小粒度的词项&#xff0c;粒度大小取决于分词器规则。 1.2 …

疑问彻底搞懂TIME_WAIT状态为什么等待2MSL的时长

文章目录 1. TIME_WAIT状态2. 等待2MSL原因 1. TIME_WAIT状态 TIME_WAIT状态是TCP连接关闭过程中的一个状态&#xff0c;它表示连接已经被关闭&#xff0c;但是仍然在等待一段时间以确保远端接收到连接关闭的确认消息。在这个状态下&#xff0c;连接不再传输数据&#xff0c;但…

单片机FLASH深度解析和编程实践(上)

本篇文章主要针对单片机FLASH编程和FLASH基本原理进行学习分享。以STM32单片机作为实例进行编程实训。 关于FLASH操作的相关寄存器及编程&#xff0c;大家可以参考下一篇文章: 单片机FLASH深度解析和编程实践&#xff08;下&#xff09;-CSDN博客 目录 一、STM32编程方式 二、…

Ansys Lumerical | 激光雷达天线仿真

附件下载 联系工作人员获取附件 在本文中&#xff0c;我们将了解如何根据激光雷达应用需求设计和优化相控阵光栅天线。 概述 激光雷达&#xff08;LIDAR&#xff09;是“light detection and ranging”的简称&#xff0c;近年来由于在机器人、自动驾驶汽车、高精度测绘等领域…

app分发步骤有那些?

APP分发的步骤主要包括以下几个方面&#xff1a; 准备应用程序&#xff1a;首先&#xff0c;开发人员需要确保应用程序已经经过完整的测试和质量保证&#xff0c;包括功能测试、用户体验测试、性能测试等&#xff0c;以确保其稳定性和可靠性。注册开发者账号&#xff1a;在相应…

万物互联的价值

随着我们习惯了万物互联&#xff0c;我们将需要改变我们的行为和使用互联网的方式。这并不像看起来那么困难。毕竟&#xff0c;自 20 世纪 90 年代中期互联网普及以来&#xff0c;你们中的许多人都会经历过各种经历的变化。你们中的许多人已经看到了网络邮件、在线电影和音乐、…

Flink实时写Hudi报NumberFormatException异常

Flink实时写Hudi报NumberFormatException异常 问题描述 在Flink项目中&#xff0c;针对Hudi表 xxxx_table 的 bucket_write 操作由于 java.lang.NumberFormatException 异常而从运行状态切换到失败状态。异常信息显示在解析字符串"ddd7a1ec"为整数时出现了问题。报…

挑战杯 机器视觉的试卷批改系统 - opencv python 视觉识别

文章目录 0 简介1 项目背景2 项目目的3 系统设计3.1 目标对象3.2 系统架构3.3 软件设计方案 4 图像预处理4.1 灰度二值化4.2 形态学处理4.3 算式提取4.4 倾斜校正4.5 字符分割 5 字符识别5.1 支持向量机原理5.2 基于SVM的字符识别5.3 SVM算法实现 6 算法测试7 系统实现8 最后 0…

基于comsol七芯光纤超模模拟分析

本期教程主要向大家介绍一期采用comsol有限元分析软件进行七芯光纤模拟分析的模拟教程。首先介绍一下基本知识点 七芯光纤超模理论&#xff08;Supermode Theory for Seven-Core Fibers&#xff09;涉及一种特殊类型的多芯光纤&#xff08;MCF&#xff09;技术。在这里&#x…