在排序数组中查找某个值——要想到二分法

使用二分法查找数组 - C++实现 接下来,我们可将数组的起始位置和结束位置作为参数传递给二分法函数,然后将指定的值与中间值进行比较。如果指定的值等于中间值,则返回中间值的下标;在处理大规模的数据时,我们经常需要对数组进行查找操作。二分法是一种非常高效的查找算法,它可以在已排序的数组中查找一个指定的值。总之,无论是哪种实现方式,二分法查找数组都是一种十分高效的算法,它可以避免我们对整个数组进行线性搜索,从而提高数据处理效率。现在,让我们来看看如何使用C++来实现二分法查找数组。以上代码用的是迭代法实现,还有一种用递归法实现的版本。 阅读详情

排序数组的查找问题首先考虑使用 二分法 解决,其可将遍历法的 线性级别 时间复杂度降低至 对数级别 。

题目:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。 

思路:

!!!排序数组查找问题别一上来就是循环遍历,想想二分法!!!

观察旋转数组可以发现:[3,4,5,1,2]中称[3,4,5]为左排序数组,[1,2]为右排序数组。PS:定义左排序数组小于右排序数组,所以最小元素是右排序数组。

突破点:最小元素(称为旋转点)就在左右排序数组之间!

算法流程:

  • 循环二分: 设置 i, j 指针分别指向 numbers 数组左右两端,m=(i+j)/2 为每次二分的中点,可分为以下三种情况:
  1. 当 numbers[m] > numbers[j]时: m 一定在 左排序数组 中,即旋转点 x 一定在 [m+1,j] 闭区间内,因此执行 i = m + 1【记住我们目的是缩小范围后的的数组都是在左右排序数组之间】;
  2. 当 numbers[m] < numbers[j] 时: m 一定在 右排序数组 中,即旋转点 x一定在[i, m] 闭区间内,因此执行 j = m【记住是m,不是m-1,因为很有可能下标m对应的值就是X】;
  3. 当 numbers[m] == numbers[j] 时: 无法判断 m 在哪个排序数组中,即无法判断旋转点 x 在 [i, m]还是 [m + 1, j] 区间中。解决方案: 执行 j = j - 1缩小判断范围 。【不能通过i=i+1来缩小判断范围,因为只能通过比较numbers[j]而不是numbers[i],本质是因为 j初始值肯定在右排序数组中; i初始值无法确定在哪个排序数组中。想想数组[1,2,3]】
  • 返回值: 当 i = j 时跳出二分循环,并返回 numbers[i] 即可。

 代码:

 if (numbers.size() == 0)
	{
		return -1;
	}

	int i = 0, j = numbers.size() - 1, m;
	while(i != j)
	{
		// 计算中间的下标
		m = ( i + j ) / 2;
		if (numbers[m] < numbers[j])
		{
			j = m;
		}
		else if (numbers[m] > numbers[j])
		{
			i = m + 1;
		}
		else
		{
			j--;
		}

	}

	return numbers[i];

 

 

语音识别(ASR)-- Kaldi 学习笔记 语音识别(ASR)-- Kaldi学习笔记语音识别简介GMM-HMM基本原理DNN-HMM(基于神经网络)KaldiKaldi架构简介Kaldi在Windows下的安装工具准备编译OpenFST配置PortAudio配置KaldiKaldi目录说明 语音识别简介 语音识别(Speech Recognition)技术,也被称为自动语音识别(Automatic Speech Recognition, ASR)、计算机语音识别(Computer Speech Recognition)或是语音转文本识别(Spee 阅读详情

相关推荐

Outlook总是提示登录微软,怎么办?

Outlook 2021反复弹出Microsoft登录窗口,可能是由于Modern Authentication身份验证机制或凭据问题导致。解决方案包括:1)通过注册表关闭Modern Authentication(适用于本地Exchange);2)清理Windows凭据管理器中的旧认证信息;3)手动配置Exchange服务器地址;4)通过注册表阻止Microsoft登录窗口弹出(适用于非M365环境)。建议按顺序尝试,尤其前两步通常能解决问题。经测试,步骤1和2已有效解决该问题。

剪刀石头布 4679

二分法在有序数组中查找一个数

算法思想: 首先条件为有序数组,先查找中间下标的元素: (1)如果该元素等于7,则返回中间下标,查找结束; (2)如果该元素大于7,则7必然在中间元素的右边部分,则缩小范围,在右半部分查找7,再计算右半部分的中间下标,转到(1) (3)如果该元素下于7,则7必然在中间元素的左半部分,则缩小范围,在左半部分查找7,再计算左半部分的中间下标,转到(1) 优点: 对于已排好序的大数组起到效率很高地查询作...

qq_40443457的博客 3529

单神经元PID控制:从Hebb到Delta,四种学习规则在MATLAB里到底怎么选?

本文深入探讨了单神经元PID控制算法在MATLAB中的四种学习规则(无监督Hebb、有监督Delta、有监督Hebb及改进Hebb)的实战对比与选型指南。通过详细的仿真实验和性能指标分析,为工程师提供了基于实际工程考量的选型建议和参数整定技巧,帮助优化复杂非线性系统的控制效果。

weixin_31220401的博客 283

知识点-二分查找

什么式二分查找? 我们知道在数组中查找一个数的方式式一个一个元素进行遍历,和需要查找的值进行对比,当数组中的元素过多的时候这种挨个查找的方式效率就变得很慢。 二分查找就是在一个从小到大排序的数组中,计算出中间的数的大小,判断要找的数时在左边还是右边。这样一次可以缩小一半的查找范围,从而提高了查找效率。在下面我就用一个java小案例来实现一下二分查找。 二分查找需求 在数组array={2,1,4,3,6,5,8,7,10,9}中找到4这个数值,用二分查找法来实现。 二分查找法的实现步骤 1、定义

qq_42344213的博客 681

从零到一:华为iMaster NCE-Campus部署中的Euler OS与FusionInsight深度解析

本文深入解析华为iMaster NCE-Campus部署中Euler OS与FusionInsight的关键技术要点,包括RAID配置、网络绑定技术、安装避坑指南及性能调优方案。通过实战经验和详细配置示例,帮助工程师提升部署效率与系统稳定性,确保华为企业级解决方案的高效运行。

f6g7h8i9j的博客 550

Android AI Agent集成实战:架构设计与自动化技能开发

AI Agent(人工智能代理)是一种能够感知环境、自主规划并执行任务以达成目标的软件实体。其核心原理在于结合大语言模型的推理能力与工具调用(Tool Calling)技术,使应用从被动响应转向主动服务。在移动开发领域,这项技术的价值在于为应用注入“智能大脑”,实现跨应用自动化与个性化交互,从而显著提升用户体验和操作效率。具体到Android平台,其应用场景广泛,例如自动填写表单、智能聊天辅助、个性化工作流优化等。本文聚焦于Android AI Agent的工程化落地,深入探讨了如何利用Accessibil

weixin_42636895的博客 664

【刷题笔记】之二分查找(搜索插入位置。在排序数组中查找元素的第一个和最后一个位置、x的平方根、有效的完全平方数)

进行二分查找的前置条件:数组有序并且数组中无重复元素 写二分查找题的代码,需要考虑清楚边界条件,比如应该是 while(left < right) 还是 where(left

m0_58761900的博客 1511

Foxmail 7.2.25以下版本XSS漏洞实战复现:手把手教你如何构造恶意邮件(含防御方案)

本文深入解析Foxmail 7.2.25以下版本的XSS漏洞(CNVD-2025-06036),详细展示如何构造恶意邮件进行跨站脚本攻击,并提供从客户端升级到企业级防护的多层次防御方案,帮助用户有效防范安全风险。

view3的博客 163

【C语言】带你玩转经典算法用二分法在一个有序数组中查找某个数

详细且通俗的解释了二分法即其优缺点,并通过画图的方式解释了二分法的运行过程,保证你看完一定有所收获!!!

君兮_的博客 2103

OpenCv —— 检测车牌号(附完整源码)

OpenCv —— 检测车牌号

5601

基于Simulink进行多相电机EMI抑制的仿真建模

特点高可靠性:通过增加相数来提供冗余,增强系统的故障容忍度。低转矩脉动:改善了电机的动态性能,减少了转矩波动。复杂的EMI管理:更多的相数意味着更复杂的电磁环境,增加了EMI抑制的难度。挑战模型复杂性:涉及电气、机械和电磁场等多个领域的相互作用。实时性要求:控制系统需要能够快速响应以适应动态负载变化。多变量优化:包括滤波器设计、PWM调制策略等在内的多个参数需综合考虑以找到最优解。使用Simscape Electrical库来构建一个多相电机模型。

amy_mhd的博客 273

Java中数组二分法查找

算法:当数组的数据量很大适宜采用该方法。采用二分法查找时,数据需是有序不重复的,如果是无序的也可通过选择排序、冒泡排序等数组排序方法进行排序之后,就可以使用二分法查找。 基本思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功;若 x 小于当前位置值,则在数列的前半段中查找;若 x 大于当前位置值则在数列的后半段中继续查找,直到找到为止,但是如...

南 墙 1万+

东方财富个股实时行情爬虫实战:从入门到精通,手把手教你构建股票数据采集系统

在量化投资、股市分析和数据挖掘等领域,获取实时、准确的股票行情数据是第一步也是至关重要的一步。东方财富网作为国内最大的财经门户网站之一,提供了丰富的股票数据和实时行情接口。本文将带你从零开始,构建一个完整的东方财富个股实时行情爬虫系统,涵盖股票代码遍历、JSON接口分析、反爬虫策略应对、数据持久化存储等核心技术点。目录前言一、项目背景与目标1.1 为什么要爬取东方财富数据?1.2 项目目标1.3 技术栈二、接口分析与逆向工程2.1 寻找真实数据接口2.2 简化接口2.3 字段含义对照表三、股票代码获取。

2201_76125261的博客 147

java算法-二分法查找实现

java算法-二分法查找实现 什么是二分法查找 首先,使用二分法查找的前提是:被查找的数组已排好序 具体实现: 假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2. 1.开始令front=0(指向3),end=7(指向88),则mid=3(指向36)。因为a[mid]>x,故应在前半段中查找。...

qq_39827033的博客 5625

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

js冒泡排序及二分法查找

JavaScript冒泡排序: var arr = [5,0,-56,90,12]; var flag = false;//标志位进行优化,数组本来就是有序序列的话,无需再排序 //先进行大的排序 for(var i=0;i<arr.length-1;i++){ //小的排序 for(var j=0;j<arr.

Curtain的博客 7465

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

使用选择排序和二分法对传入的数组进行排序和查找

选择排序和二分法 使用二分法查找数组中某个值得位置是要在数组提前排好序的前提下才能使用,所以要将数组进行排序。 数组排序有冒泡排序,选择排序,插入排序等,今天我们使用选择排序对数组进行排序。 测试类代码如下图 运行结果如下图 (位置为i+1)所以位置是从1开始 选择排序代码 public class Sort13 { public void selectionSort(int[] list) ...

weixin_44822511的博客 694

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

二分法查找法查找key值

【问题描述】 编写程序,建立一个静态的整型一维数组a,它共有九个元素,依次是1、12、23、34、45、56、67、68、89,在该数组元素中采用二分法查找法查找key值。若找到key,则打印对应的下标,否则打印-1。 【输入形式】一个整数n,0<n<100 【输出形式】下表x或者-1 【样例输入】1 【样例输出】0 二分法: 基本思想:假设数据是按升序排序的,对于给定值key,从序列的中间位置k开始比较, 如果当前位置arr[k]值等于key,则查找成功; 若key小于当前位置值arr[k],

Leuchten的博客 4769

二分法简单排序和查找

二分法排序算法思想简单描述: 在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们 中间的那个元素比,如果小,则对前半再进行折半,否则对后半 进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间 的所有元素后移,再把第i个元素放在目标位置上。 直接看代码。 public static void DichotomySort(int[] array)

杨友山 1万+

Java二分法在已排序数组中查找指定数

public static int binarySearch(int[] sortedArr , int target){ int start = 0; int end = sortedArr.length - 1; do{ int mid = (start + end)/2; if(target > sortedArr[mid]){ st

敏于行 3910

Java二分法查找

Java二分法查找 二分法查找(又称为折半法) 二分法基本思想是设数组中的元素从小到大有序的存放在数组中,首先将给定值key与数组中间位置上 元素的关键码(key)比较,如果相等,则检索成功。 否则,若key小,则在数组前半部分中继续进行二分法检索; 若key大,则在数组后半部分中继续进行二分法检索; 这样经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。 有二种方法可以写二...

qq_41991743的博客 2217

Java之数组排序及二分法查找

首先先介绍两种最基本的数组排序方法:冒泡法和选择法。 冒泡法排序:依次比较相邻的两个元素,如果第一个比第二个大,则交换他们两个,如此一轮比较下来会产生一个最大的数位于数组末尾,第二次比较则进行到数组长度-1个元素,以此类推。 /** * 冒泡法排序(从小到大) * @param a 需要排序的数组 * @return 排序完成后的数组 */ ...

li1376417539的博客 2497

Java 二分法查找数组元素

Java 二分法查找数组元素

weixin_49767663的博客 749

在排序数组中查找数字---二分法

面试题53:统计一个数字在排序数组中出现的次数。 解法一:二分法的变形 class Solution { public: int GetNumberOfK(vector<int> data ,int k) { if(data.empty()) return 0; int low = 0, high = data.size(...

weixin_43892514的博客 630

Leetcode题解——二分法查找排序数组中搜索数字

33. 搜索旋转排序数组 此题和剑指offer第6题本质上是一样的。 我的第一思路其实是: class Solution: def search(self, nums: List[int], target: int) -> int: for k,v in enumerate(nums): if v == target: return k return -1 但是这个题好像想考的是二分法,于.

hitzijiyingcai的博客 378

java数组之线性查找、二分法查找

介绍线性查找和二分法查找的算法逻辑并代码实现

weixin_44554794的博客 1432
上一篇: 青蛙跳台阶问题解决思路
下一篇: 设计模式概要
Quellaaa
博客等级 码龄9年 24粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值