【算法】二分查找——二分查找

本节博客详述“二分查找”并且以例子来进行讨论,有需要借鉴即可。

目录

  • 1.二分查找
    • 1.1使用前提
    • 1.2模板
  • 2.题目
  • 3.题解代码示例
  • 4.二分查找的一般模板
  • 5.总结

1.二分查找

1.1使用前提

使用的条件:数组具有“二段性,二段性指的是数组可以根据某一规律分为两组,且在干掉一半之后仍可以对另一半进行复用相同的规律。

1.2模板

二分查找的代码具有高度统一性,因而可以套用模板,但这并不意味着自己不需要用脑子无脑套模板。

一般二分查找模板、查找左边界二分模板、查找右边界二分模板。

下面是通过一道具体的题目来介绍二分查找算法的由来。

2.题目

题目链接:LINK
在这里插入图片描述
首先肯定是暴力解法,挨个遍历就行了,找到了返回对应的下标,找不到返回-1

但是这个暴力解法有点慢,慢就慢在一次只能干掉一个数字。

有序数组满足“二段性”,这里的“二段性”就是以某个数字作比较,可以将数组分为比这个数字大的一组和小的一组,因而可以利用有序的特点直接上二分查找算法。
在这里插入图片描述

思考:结束条件是什么?
答:left <= right,这个等于一定要注意,因为一个数字也要判断一下。
不然会出下以下“悲剧”:
在这里插入图片描述

思考:为什么一定得二分,而不是三分、四分…N分?
答:这里推一篇文章,有兴趣可以看一下:LINK

二分查找复杂度
答:logN在这里插入图片描述

3.题解代码示例

class Solution {
public:int search(vector<int>& nums, int target) {//一般情况for(int left = 0,right = nums.size() - 1,mid; left <= right;){//mid = (left + right) / 2;mid = left + (right - left) / 2;//优化,防止两数相加溢出问题if(nums[mid] > target)right = mid - 1;else if(nums[mid] < target)left = left + 1;else return mid;}return -1;}
};

4.二分查找的一般模板

while(left < right)
{
int mid = left + (right - left) / 2;
if(...)
//
else if(...)
//
else
return ...
}

5.总结

我感觉二分查找大部分人是比较熟悉的,这里需要注意两个点,为什么是二分?二分查找的使用前提一定是有序吗?

题目太简单,不多说。


EOF

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

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

相关文章

如何将公众号添加到CSDN个人主页

1. 创作中心- 推广管理 输入个人公众号名字并开启微信公众号推广 2. 将公众号的二维码图片加入拓展信息 个人主页的左下角就能看到推广 如果希望能看到是二维码 操作如下&#xff1a; 写篇文章贴上二维码 然后点击鼠标右键获得此页面链接 &#xff0c;例如我的个人公众号 htt…

MyBatis的注解实现复杂映射开发

xml 配置方式实现复杂映射回顾 ​ 实现复杂映射我们之前可以在映射文件中通过配置来实现&#xff0c;使用注解开发后&#xff0c;我们可以通过 Results 注解&#xff0c;Result 注解&#xff0c;One 注解和 Many 注解组合完成复杂关系的配置。 注解说明Results代替的是标签 …

举个栗子!Tableau 技巧(273):用葡萄干布丁图(Plum Pudding Chart)查看数据

葡萄干布丁图 / Plum Pudding Chart 葡萄干布丁图&#xff08;Plum Pudding Chart&#xff09;源自英国传统的葡萄干布丁&#xff0c;它由多种原料混合而成&#xff0c;每种原料的比例不同&#xff0c;葡萄干布丁图用于展示多种不同类型的数据。 葡萄干布丁图由一系列同心圆环…

mysql的隔离性——MVCC

MVCC通过undolog版本链和readview来实现 更新和删除时会写入undolog中。 读已提交&#xff1a;在事务任意读时创建readview&#xff0c;读最新提交的事务 可重复读&#xff1a;在事务第一次读时创建readview

电力物联网-(2)系统设计

电力物联网系统设计 前言 在此之前写过《电力物联网系统设计》开篇文章&#xff0c;上一篇文章主要的概述性的内容&#xff0c;发表之后总觉得对电力物联网系统设计这一方面还只是开了一个头&#xff0c;没有把相关的内容讲解清楚&#xff0c;于是经过一段时间的构思终于产出了…

千层烤馍,五彩斑斓的甘肃特色美食

甘肃玫瑰千层烤馍是一道具有浓郁地方特色的传统面点&#xff0c;以其独特的口感和精美的外观而闻名。食家巷的千层烤馍更是其中的佼佼者&#xff0c;它采用了优质的原料和传统的制作工艺&#xff0c;让你品尝到最正宗的甘肃味道。 食家巷千层烤馍的制作过程非常讲究&#xff0c…

蓝桥杯-线性动态规划问题背包问题进阶策略详解-奇怪的段

0奇怪的段【算法赛】 - 蓝桥云课 (lanqiao.cn) 基础dp&#xff1a; #include<iostream> #include<cstring> #include<algorithm>using namespace std;const int N1e56;typedef long long ll;ll f[N][206]; ll a[N]; ll sum[N]; ll p[206]; int n,k;int main…

Python 和Java 哪个更适合做自动化测试?

Python和Java都是常用于自动化测试的编程语言&#xff0c;它们各有优势和适用场景。本文将从零到一地详细描述Python和Java在自动化测试中的特点和应用。 首先&#xff0c;我们来介绍Python在自动化测试中的优势。 Python是一种简洁、易读且功能强大的编程语言&#xff0c;它…

链表----带环链表快慢指针进阶版

1.带环链表及其拓展 &#xff08;1&#xff09;这个题目组要就是进行判断这个链表是否带环&#xff0c;使用的是布尔类型作为返回值&#xff1b; &#xff08;2&#xff09;我们这里的思路是使用的快慢指针&#xff0c;快指针一次走2步&#xff0c;慢指针一次走1步&#xff0c…

C++:编程领域的全能王者

在编程语言的海洋中&#xff0c;C以其全面而强大的功能&#xff0c;犹如一位全能王者&#xff0c;屹立不倒。它不仅在科技领域有着广泛的应用&#xff0c;更在推动社会进步、促进人类创新方面发挥着至关重要的作用。 一、C&#xff1a;编程界的璀璨明星 C自诞生以来&#xff…

【数据结构】红黑树(定义性质、插入、查找、删除)解析+完整代码

3.3 红黑树 3.3.1 定义和性质 为什么发明红黑树&#xff1f; 平衡二叉树和红黑树的时间复杂度相同&#xff0c;但是平衡二叉树的平衡特性容易被破坏&#xff0c;需要频繁调整树的形态。 红黑树RBT&#xff1a;插入/删除很多时候不会破坏红黑特性&#xff0c;无需频繁调整树的形…

浅谈Windows 上的线程亲和性(Thread affinity)

​ 前言 线程属性包括是否分离、亲和性、调度策略和优先级等。Linux默认的调度策略是CFS(完全公平调度算法),而 Windows 是基于优先级抢占式的策略。 在这些方面,Windows 和 Linux 差异巨大。本文仅针对 Windows 系统的线程亲和性进行探讨。 线程亲和性(Thread affinity) 什…