二分查找——OJ题(二)

在这里插入图片描述


📘北尘_:个人主页

🌎个人专栏:《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》

☀️走在路上,不忘来时的初心

文章目录

  • 一、点名
    • 1、题目讲解
    • 2、算法原理
    • 3、代码实现
  • 二、搜索旋转排序数组中的最⼩值
    • 1、题目讲解
    • 2、算法原理
    • 3、代码实现
  • 三、寻找峰值
    • 1、题目讲解
    • 2、算法原理
    • 3、代码实现
  • 四、山峰数组的峰顶
    • 1、题目讲解
    • 2、算法原理
    • 3、代码实现


一、点名

1、题目讲解

在这里插入图片描述

2、算法原理

关于这道题中,时间复杂度为 O(N) 的解法有很多种,⽽且也是⽐较好想的,这⾥就不再赘述。
本题只讲解⼀个最优的⼆分法,来解决这个问题。
在这个升序的数组中,我们发现:
▪ 在第⼀个缺失位置的左边,数组内的元素都是与数组的下标相等的;
▪ 在第⼀个缺失位置的右边,数组内的元素与数组下标是不相等的。

3、代码实现

class Solution {
public:int takeAttendance(vector<int>& records) {int left=0,right=records.size()-1;while(left<right){int mid=left+(right-left)/2;if(records[mid]==mid) left=mid+1;else right=mid;}return records[left]==left?left+1:left;}
};

二、搜索旋转排序数组中的最⼩值

1、题目讲解

在这里插入图片描述
在这里插入图片描述

2、算法原理

在这里插入图片描述
其中 C 点就是我们要求的点。
⼆分的本质:找到⼀个判断标准,使得查找区间能够⼀分为⼆。
通过图像我们可以发现, [A,B] 区间内的点都是严格⼤于 D 点的值的, C 点的值是严格⼩于 D 点的值的。但是当 [C,D] 区间只有⼀个元素的时候, C 点的值是可能等于 D 点的值的。
因此,初始化左右两个指针 left , right :
然后根据 mid 的落点,我们可以这样划分下⼀次查询的区间:
▪ 当 mid 在 [A,B] 区间的时候,也就是 mid 位置的值严格⼤于 D 点的值,下⼀次查询区间在 [mid + 1,right] 上;
▪ 当 mid 在 [C,D] 区间的时候,也就是 mid 位置的值严格⼩于等于 D 点的值,下次查询区间在 [left,mid] 上。
当区间⻓度变成 1 的时候,就是我们要找的结果。

3、代码实现

class Solution {
public:int findMin(vector<int>& nums) {int left=0,right=nums.size()-1,n=nums.size();while(left<right){int mid=left+(right-left)/2;if(nums[mid]>nums[n-1]) left=mid+1;else right=mid;}return nums[left];}
};

三、寻找峰值

1、题目讲解

在这里插入图片描述

2、算法原理

寻找⼆段性:
任取⼀个点 i ,与下⼀个点 i + 1 ,会有如下两种情况:
• arr[i] > arr[i + 1] :此时「左侧区域」⼀定会存在⼭峰(因为最左侧是负⽆穷),那么我们可以去左侧去寻找结果;
• arr[i] < arr[i + 1] :此时「右侧区域」⼀定会存在⼭峰(因为最右侧是负⽆穷),那么我们可以去右侧去寻找结果。

3、代码实现

class Solution {
public:int findPeakElement(vector<int>& nums) {int left=0,right=nums.size()-1;while(left<right){int mid=left+(right-left)/2;if(nums[mid]<nums[mid+1]) left=mid+1;else right=mid;}return left;}
};

四、山峰数组的峰顶

1、题目讲解

在这里插入图片描述
在这里插入图片描述

2、算法原理

  1. 分析峰顶位置的数据特点,以及⼭峰两旁的数据的特点:
    ◦ 峰顶数据特点: arr[i] > arr[i - 1] && arr[i] > arr[i + 1] ;
    ◦ 峰顶左边的数据特点: arr[i] > arr[i - 1] && arr[i] < arr[i + 1] ,也就是呈现上升趋势;
    ◦ 峰顶右边数据的特点: arr[i] < arr[i - 1] && arr[i] > arr[i + 1] ,也就是呈现下降趋势。
  2. 因此,根据 mid 位置的信息,我们可以分为下⾯三种情况:
    ◦ 如果 mid 位置呈现上升趋势,说明我们接下来要在 [mid + 1, right] 区间继续搜索;
    ◦ 如果 mid 位置呈现下降趋势,说明我们接下来要在 [left, mid - 1] 区间搜索;
    ◦ 如果 mid 位置就是⼭峰,直接返回结果。

3、代码实现

class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int left=1,right=arr.size()-2;while(left<right){int mid=left+(right-left+1)/2;if(arr[mid]>arr[mid-1]) left=mid;else right=mid-1;}return left;}
};

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

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

相关文章

rime中州韵 程序配置结构讲解 保姆级教程

在完成了 Rime 引擎/框架的安装&#xff0c;并安装了基础输入方案后&#xff0c;我们就可以在这个基础上开始 DIY 了。毕竟&#xff0c;Rime 最大的优势就是可定制性强。 但是&#xff0c;在我们 DIY 前&#xff0c;我们需要先做些准备工作。磨刀不误砍柴工&#xff0c;我们需…

Javaweb见解

1 web相关的概念 1.1 软件的基本架构 C/S(Client-Server)。比如我们手机上的app QQ软件 飞秋 特点&#xff1a;必须下载特定的客户端程序。服务端升级之后&#xff0c;客户端也需要随着升级。 B/S(Broswer-Server).比如京东网站&#xff0c;腾讯qq官方网站 特点&#xff1…

一文搞清楚Java BytesToAscii和AsciiToBytes

文章目录 BytesToAsciiAsciiToBytes10进制和16进制byte对比 bytes2HexString和hexStringToBytes测试 BytesToAscii Testpublic void convertBytesToAscii() {byte[] bytes new byte[] { 0x31, 0x32, 0x33, 0x34, 0x35 };String asciiString new String(bytes);System.out.pri…

你怎么看待软件测试这个工作的?转行真的甘心吗!

先说一个插曲&#xff1a;上个月我有同学在深圳被裁员了&#xff0c;和我一样都是软件测试&#xff0c;不过他是平安外包&#xff0c;所以整个组都撤了&#xff0c;他工资和我差不多都是14K。 现在IT互联网已经比较寒冬&#xff0c;特别是软件测试&#xff0c;裁员先裁测试&am…

KaiwuDB 时序引擎数据去重功能详解

一、背景介绍 随着物联网领域的快速发展&#xff0c;时序数据的产生和处理需求不断增长。时序数据是按照时间顺序收集和记录的数据&#xff0c;其特点在于数据具有时间戳&#xff0c;并且时间是数据分析和查询的一个重要维度。 在实际场景中&#xff0c;可能存在多条相同时间…

k8s是什么

生么是k8s&#xff1a; Kubernetes:8个字母省略&#xff0c;就是k8s 自动部署&#xff0c;自动扩展和管理容器化部署的应用程序的一个开源系统、 k8s是负责自动化运维管理多个容器化程序的集群&#xff0c;是一个功能强大的容器编排工具。 分布式和集群化的分布式进行容器管…

分支限界法求解01背包(优先队列)【java】

实验内容&#xff1a;运用分支限界法解决0-1背包问题 实验目的&#xff1a;分支限界法按广度优先策略遍历问题的解空间树&#xff0c;在遍历过程中,对已经处理的每一个结点根据限界函数估算目标函数的可能取值&#xff0c;从中选取使目标函数取得极值的结点优先进行广度忧先搜…

python 面试题第一弹

1. 如何理解Python中的深浅拷贝 浅拷贝&#xff08;Shallow Copy&#xff09;创建一个新的对象&#xff0c;该对象的内容是原始对象的引用。这意味着新对象与原始对象共享相同的内存地址&#xff0c;因此对于可变对象来说&#xff0c;如果修改了其中一个对象&#xff0c;另一个…

Echarts随机生成颜色

Echarts生成随机颜色&#xff0c;并且不要黑色、灰色、棕色等难看的颜色&#xff0c;暖色系并且颜色亮丽&#xff0c; 可以通过修改saturation 和lightness 的随机数值&#xff0c;提高颜色饱和度和亮度 function generateWarmColor() {let hue Math.floor(Math.random() * 3…

arcpy获取矢量坐标系

代码&#xff1a; shppath "矢量路径" shpdescribe arcpy.Describe(shppath) print(shpdescribe.spatialReference.name) 结果&#xff1a;

智能优化算法应用:基于袋獾算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于袋獾算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于袋獾算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.袋獾算法4.实验参数设定5.算法结果6.参考文献7.MA…

人工智能_机器学习078_聚类算法_概念介绍_聚类升维_降维_各类聚类算法_有监督机器学习_无监督机器学习---人工智能工作笔记0118

首先看一下什么是聚类,我们可以进入sklearn的官网去看看 可以看到这里,首先classification 这个分类我们学完了,然后就是regression回归我们也学完了对吧,其实我们现实生活中的,大部分问题就是 这两种问题就可以解决了. 然后我们再来看一个: clustering,这个就是聚类对吧.聚类算…

【Linux驱动】最基本的驱动框架 | LED驱动

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux驱动》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f3c0;最基本的驱动框架⚽驱动程序框架⚽编程 &#x1f3c0;LED驱动⚽配置GPIO⚽编程…

顺序表的基本操作(必学)

目录 线性表&#xff1a; 顺序表&#xff1a; 概念和结构&#xff1a; 动态顺序表常用操作实现&#xff1a; 头文件&#xff08;数组顺序表的声明&#xff09;&#xff1a; 各种基本操作总的声明&#xff1a; 顺序表的初始化&#xff1a; 顺序表的销毁 顺序表的打印 …

3分钟了解安全数据交换系统有什么用!

企业为了保护核心数据安全&#xff0c;都会采取一些措施&#xff0c;比如做网络隔离划分&#xff0c;分成了不同的安全级别网络&#xff0c;或者安全域&#xff0c;接下来就是需要建设跨网络、跨安全域的安全数据交换系统&#xff0c;将安全保障与数据交换功能有机整合在一起&a…

Wordpress对接Lsky Pro 兰空图床插件

Wordpress对接Lsky Pro 兰空图床插件 wordpress不想存储图片到本地&#xff0c;访问慢&#xff0c;wordpress图片没有cdn想要使用图床&#xff0c;支持兰空自定义接口 安装教程—在wp后台选择插件zip—然后启用—设置自己图床API接口就ok了&#xff0c;文件全部解密&#xff0c…

实习知识整理9: 点击直接购买按钮后,跳转到确认订单页面

1. 为按钮绑定事件 <button id"addCartButton">加入购物车</button><br/> $("#buyButton").click(function () {if ( ! loginUser) {// 如何将商品信息传递到后台&#xff0c;后台能够将内容在新的订单页面显示$("#buyItemForm&quo…

[SWPUCTF 2021 新生赛]hardrce

[SWPUCTF 2021 新生赛]hardrce wp 参考博客&#xff1a;https://www.cnblogs.com/bkofyZ/p/17644820.html 代码审计 题目的代码如下&#xff1a; <?php header("Content-Type:text/html;charsetutf-8"); error_reporting(0); highlight_file(__FILE__); if(is…

数据结构之<堆>的介绍

1.简介 堆是一种特殊的数据结构&#xff0c;通常用于实现优先队列。堆是一个可以被看作近似完全二叉树的结构&#xff0c;并且具有一些特殊的性质&#xff0c;根据这些性质&#xff0c;堆被分为最大堆&#xff08;或者大根堆&#xff0c;大顶堆&#xff09;和最小堆两种。 2.…

H266/VVC帧间预测编码技术概述

帧间预测编码简述 帧间预测利用视频时间域的相关性&#xff0c;使用邻近已编码图像像素值预测当前图像的像素值&#xff0c;能有效去除视频时域冗余。 目前主要的视频编码标准中&#xff0c;帧间预测都采用基于块的运动补偿技术&#xff0c;不同的编码标准有不同的分块方式。 …