算法练习:二分查找

目录

  • 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,一经查实,立即删除!

相关文章

掌握高级设计原则: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…

PTA冰岛人

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

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

随着人工智能、大数据、区块链等技术在城市中快速发展&#xff0c;人们日常生活中已经离不开网络的支撑&#xff0c;而实现“人与人”、“人与物”及“物与物”之间高速连接应用的“时延”&#xff0c;是网络支撑中最重要的存在。 以城市生活例子为例&#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;近年来由于在机器人、自动驾驶汽车、高精度测绘等领域…

万物互联的价值

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

挑战杯 机器视觉的试卷批改系统 - 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…

【消息队列开发】 测试MessageFileManager(对硬盘中的消息操作)类

文章目录 &#x1f343;前言&#x1f384;测试流程&#x1f334;准备工作&#x1f332;测试创建队列功能&#x1f333;测试统计文件的读写&#x1f38b;测试将相应消息放入文件中&#x1f38d;测试读文件里的消息到内存&#x1f340;测试删除消息&#x1f60e;测试垃圾回收⭕总…

MySQL行锁核心知识介绍

MySQL的行锁是数据库中用于控制并发访问的一种机制。它允许在数据库的行级别上实现锁定&#xff0c;从而允许多个事务同时修改不同行的数据&#xff0c;而不会相互干扰。这种锁机制可以提高数据库的并发性能&#xff0c;减少锁争用&#xff0c;提高事务的吞吐量。在本教程中&am…

电视盒子解析安装包失败,安卓4.4安装不了kodi的解决方法,如何安装kodi

有些安卓电视或者电视盒子的安卓系统版本太低、自身架构或者屏蔽了安装其他应用的功能&#xff0c;下载的Kodi apk安装包提示无法安装&#xff0c;解析程序包时出现问题、解析出错无法安装、[INSTALL_FAILED_OLDER_SDK]、此应用与您的电视不兼容。 解决方法&#xff1a; 1、3…

OFDM调制解调过程

OFDM&#xff1a; Orthogonal Frequency Division Multiplexing 正交频分复用 1、OFDMA处理流程图 2、QPSK星座图和映射关系 QPSK&#xff08;Quadrature Phase Shift Keying&#xff0c;正交相移键控&#xff09;四相相移调制是利用载波的四种不同相位差来表征输入的…

服务器数据恢复—服务器硬盘灯显示红色的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台服务器中有一组由多块硬盘组建的raid阵列&#xff0c;在运行过程中服务器突然崩溃&#xff0c;管理员检查服务器发现该服务器raid阵列中有两块硬盘的指示灯显示红色。于是&#xff0c;管理员重启服务器&#xff0c;服务器重启后&a…

大规模自动化重构框架--OpenRewrite浅析

目录 1. OpenRewrite是什么&#xff1f;定位&#xff1f; 2. OpenWrite具体如何做&#xff1f; 3. 核心概念释义 3.1 Lossless Semantic Trees (LST) 无损语义树 3.2 访问器&#xff08;Visitors&#xff09; 3.3 配方&#xff08;Recipes&#xff09; 4. 参考链接 Open…