算法-数组篇01-二分查找

算法分析之数组问题 文章目录一、数组理论基础二、leetcode例题讲解数组问题 一、数组理论基础 数组是非常基础的数据结构。 首先要知道数组在内存中的存储方式:数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标下对应的数据。 需要两点注意的是: 数组下标都是从0开始的。 数组内存空间的地址是连续的。 正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。 数组的元素是不能删的,只能覆盖。 二维数组在内存的空间地址是连续的么?在Jav 阅读详情

二分查找

力扣题目链接

原理

二分查找就是对一个已经排好序的线性表进行查找的算法,该算法要求查找的对象必须是已经排序的线性表并且其中不含有重复的元素。
本文默认为升序排列
查找过程:
选取左右两个范围leftp和rightp,分别对应着查找的左右边界;midp则是查找区间的中间。

int leftp = 0, rightp = nums.size() - 1;
//midp的计算,左边界leftp加上目标区间的长度(rightp - leftp)取半
//这里很容易出错
int midp = leftp + (rightp - leftp) / 2;  

然后对目标数据target与midp位置的数据进行比较,如果target小于nums[midp],说明target在leftp和midp之间的位置;如果target大于nums[midp],说明target在midp和rightp之间的位置;如果相等则说明找到了目标数据的位置,直接返回即可。
对于上述逻辑可以理解的话,我们就可以取减半后的区间重复上述操作即可。重复直到找到目标数据或者目标数据不在该线性表中即可。

看到这里,相信大家可以尝试去力扣上自己实现一下了。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int leftp = 0, rightp = nums.size() - 1;
        while(leftp <= rightp){
            int midp = leftp + (rightp - leftp) / 2;
            if(target < nums[midp]){
                rightp = midp - 1;
            }
            else if(target > nums[midp]){
                leftp = rightp + 1;
            }
            else if(target == nums[midp]){
                return midp;
            }
        } 

        return -1;
    }
};

在代码中我们可以看到,无论是leftp还是rightp都不是直接赋值midp。这是因为对于midp位置的数据我们已经知道不等于目标数据了,所以我们向左(向右)移动一位,提高查询效率。
结束的判定条件为:查询到目标数据或者左右的指针重叠时说明已经完成了二分查找的过程了。

算法总结

  • 二分查找的时间复杂度为O(logn),空间复杂度为O(1),在查找算法中属于比较快的算法;
  • 但是其弊端也是非常明显的,需要提前对于数据集进行排序,并且不能有重复的数据(查询数据只能查找到一个),所以该算法的使用具有一定的局限性。
算法-05-二分查找 学习和介绍 算法之 二分查找 阅读详情

相关推荐

二分查找算法

摘要 二分查找,一个很经典的算法。但是真正理解透彻这个算法却不容易。下面记载一点自己学习二分查找的心得。 参考 正文: 二分查找有N多种写法,有各种各样的形式,选一种合适自己,自己能够理解记住的才是最好的。下面分享一个我比较赞的版本。 对于最最最原始的二分查找,即给出一个Key,查找出key值的索引号。 注意注意注意!!最经典的二分查找对返回来的索引号没有任何要求,只要其对应的值是...

SCUT_Sam 5007

简单的背包——01背包(6)

简单的背包——01背包(6) 题目来源:洛谷 P1510 精卫填海 原题 共十个测试点 题解 简单的二分查找——二分(2) AC代码 #include <bits/stdc++.h> using namespace std; const int maxn = 1e4 + 5; int v, n, c; int k, m; // f[x] 表示 x 体力可以搬运的石头的体积最大值 int f[maxn]; int main() { memset(f, 0, sizeof(f));

miaomiaopu的blog 133

Oracle PLM Agile936 单点登录配置方式

Oracle PLM Agile936 单点登录配置方式

Jay的个人博客 824

树状数组——谜一样的牛

思路:题意转化一下就是,建立一个初始为1的01序列c,从后往前扫,每一头牛的身高就是在序列c中第a[i]+1个1出现的位置下标。

测试 172

5G物理层基础知识

1、关于RB和RE (1) RB(Resource Block,资源块)频率上连续12个子载波,时域上一个slot(时隙,14个ofdm符号) (2) RE(Resource Element,资源单元)频率上一个子载波,及时域上一个ofdm符号 注意:协议规定,5G每个时隙(非扩展CP)的符号数为14个(扩展CP情况下每个时隙有12个符号),而LTE(非扩展CP)每个时隙的符号数为7个。 简单说:一个12X14的方格,大的整个叫一个RB,每一个小块叫一个RE。另外,一个RE可存放一个调制符号(mo.

qq_39074243的博客 2万+

STM32H750VBT6在Keil5下载报错?三步搞定Flash Download Failed Cortex-M7问题

本文针对STM32H750VBT6在Keil5开发环境中常见的“Flash Download Failed Cortex-M7”下载报错问题,提供了系统性的三步解决方案。核心在于理解该芯片128KB内部Flash的特殊性,并详细指导用户检查更新Device Pack、精确配置Flash下载算法地址(0x08000000, 0x20000)以及进行硬件连接验证,从而快速修复调试器与芯片间的Flash操作协议问题。

weixin_29274969的博客 480

244. 谜一样的牛——二分+树状数组

有 n 头奶牛,已知它们的身高为 1∼n 且各不相同,但不知道每头奶牛的具体身高。现在这 n 头奶牛站成一列,已知第 i 头牛前面有 Ai 头牛比它低,求每头奶牛的身高。输入格式第 1 行:输入整数 n。第 2…n 行:每行输入一个整数 Ai,第 i 行表示第 i 头牛前面有 Ai 头牛比它低。(注意:因为第 1 头牛前面没有牛,所以并没有将它列出)输出格式输出包含 n 行,每行输出一个整数表示牛的身高。第 i 行输出第 i 头牛的身高。

与其邻渊羡渔,不如退而结网 780

PINN物理信息网络 | 物理信息硬约束下的混合专家训练框架

PINN物理信息网络 | 物理信息硬约束下的混合专家训练框架

算法如诗的博客 879

suanfa7==二分法从有序数组中找到某个值

代码】suanfa7==二分法从有序数组中找到某个值。

hebian1994的博客 130

华为OD机试 - 猴子吃桃 - 二分查找(Java 新系统 100分)

每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 3850

【Zephyr电源与功耗专题】13_PMU电源驱动介绍

本文介绍的PMU芯片包含2路DCDC和6路LDO,在Zephyr实时操作系统下实现了完整的电源管理解决方案。

zero的博客 842

P1948 [USACO08JAN]Telephone Lines S(二分&01bfs)

P1948 [USACO08JAN]Telephone Lines S(二分&01bfs) 注意01bfs的方式。 如果要用vis数组,则判断的条件是这样。 if((d[v]<=d[u]+(w>x) && vis[v])) continue; 这里是与条件,因为可能存在v之前被访问过,vis[v]=1vis[v]=1vis[v]=1,但是d[v]>d[u]+(w>x)d[v]>d[u]+(w>x)d[v]>d[u]+(w>x) 的情况

Harris-H的博客 696

LeRobot 入门教程(一)软件环境、部署流程及摄像头配置

🤖 LeRobot:开源机器人学习平台 摘要:LeRobot是一个基于PyTorch的开源机器人学习平台,提供模型、数据集和工具,旨在降低机器人技术门槛。平台包含经过验证的模仿学习和强化学习方法,并提供预训练模型、人类演示数据集及模拟环境。安装需从源码获取,支持Python 3.10环境,可选扩展包括仿真环境(如gym-aloha)、电机控制(Dynamixel/Feetech SDK)和实验跟踪(Weights & Biases)。该平台托管在HuggingFace,并设有社区Discord频道

2506_90492529的博客 3417

2022-04-03每日刷题打卡

2022-04-03每日刷题打卡 01序列2 - 题目 - Daimayuan Online Judge 又是大家最喜欢的01序列问题了呢 这次的问题非常的简单,c觉得一个01序列中两个1之间至少要有k个0,现在他要构造出一个长度为n的01序列,请问他有多少种不同的构造方法 这个数字可能会非常大,请你对10^9+7取模 输入格式 一行,给出两个整数n,k 输出格式 一个整数,代表不同的构造方法数 数据范围 1≤n≤10^6 0≤k<n 样例输入 4 2 样例输出 6 首先题目说了,每两个1直接要有

fnmdpnmsl的博客 994

33、嵌入式系统中的内存操作与实时操作系统

本博客详细探讨了嵌入式系统中的内存操作和实时操作系统(RTOS)的基本原理及应用。内容涵盖C、C++和MicroPython三种语言下的SDRAM读写示例,并结合机器人真空吸尘器的实际应用说明内存的使用场景。此外,还介绍了RTOS的核心概念、组件及其工作机制,包括任务、事件、互斥锁、信号量、队列等,并以FreeRTOS和Mbed OS为例展示了RTOS的配置与使用方法。最后,通过常见问题和实践项目加深对嵌入式系统开发的理解。

zz67890的博客 145

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

算法学习day01:二分查找,数组移除元素(Java)

二分查找是比较常见的查找方式,大概逻辑是:把一个递增/递减的数组从中间分成两半,找到有目标元素的一半数组 继续分开,一直循环,直到只剩下目标元素。想使用二分查找,前提条件是:数组是递增/递减的,且数组没有重复的元素。

2301_80840872的博客 1666

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【代码随想录-数组篇01】:二分查找相关力扣练习题

本篇共包含5道使用二分查找可以解决的力扣编程题目,全部用python语言进行实践。

MXZJSJ1112的博客 1271

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

01数组-二分查找算法

数组&二分查找算法

Elaine2391的博客 222

Leetcode 01-算法入门与数组-④数组二分查找

二分查找的基本算法思想为:通过确定目标元素所在的区间范围,反复将查找范围减半,直到找到元素或找不到该元素为止。以下是二分查找算法的基本步骤:初始化:首先,确定要查找的有序数据集合。可以是一个数组或列表,确保其中的元素按照升序或者降序排列。确定查找范围:将整个有序数组集合的查找范围确定为整个数组范围区间,即左边界 leftleftleft 和右边界 rightrightright。计算中间元素:根据 mid=⌊(left+right)/2⌋mid = \lfloor (left + right) / 2 \r

qq_34903176的博客 544

01-算法打卡-数组-二分查找-leetcode(704)-第一天

数组可以通过下标索引快速获取数据,因为数组的存储空间是连续的所以在删除、更新数据的时候需要移动其他元素的地址。下图是一个数组的案例图形:【内存连续、索引小标从0开始可以依次获得数据】删除113位置的数据,删除前和删除后对照数组的元素是不能删除的,只能覆盖。

Bonnie_1215的博客 1110

LeetCode算法——算法入门Day01之二分查找

二分查找 思路分析 时间复杂度 代码

u014112521的专栏 4726

⭐算法入门⭐《二分枚举》简单01 —— LeetCode 704. 二分查找

《二分枚举》简单01 —— LeetCode 704. 二分查找

英雄哪里出来 7578

算法沉淀——二分查找(leetcode真题剖析)

二分查找(Binary Search)是一种在有序数组中查找特定元素的算法。该算法的基本思想是通过每一次比较,将查找范围缩小一半,最终找到目标元素或者确定目标元素不存在。

立志做一个高产且细节博主 1656

代码随想录 数组-01-二分查找

34. 在排序数组中查找元素的第一个和最后一个位置中等给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1, -1]。你必须设计并实现时间复杂度为O(log n)的算法解决此问题。示例 1:nums = [[3,4]示例 2:nums = [[-1,-1]示例 3:[-1,-1]nums是一个非递减数组//记录正确的值}else {

m0_74267125的博客 1058

【python算法打卡Day01】0814:LeetCode 704 二分查找、27 移除元素、977 有序数组的平方

算法练习

huayaomi2370的博客 1784

【面试:基础篇01:整数二分查找】

【面试:基础篇01:整数二分查找】 00.前言 大家好我是一名大二的学生,目前正在实习,在大佬@铁甲小宝同学的帮助下开始在csdn上更新博客,请多多找。 关于我写的内容有任何问题还请指出,感谢各位。 01.简介 二分查找是查找算法的一种,在顺序情况下有着 log⁡2N\log_2^Nlog2N​良好的时间复杂度 02.算法步骤 在{1,3,5,6,7,9,13,25,34,61,88} 总共11个元素中 找到25的步骤,规定下标从0开始 首先我们选择下标0,10作为左右边界l,r 中间值mid=(

m0_71229547的博客 388
上一篇: C#学习笔记——数据与运算(二)
下一篇: 算法-数组篇02-移除元素
Buling_0
博客等级 码龄5年 232粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值