二维数组中的查找 之 二分法

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。

请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;
如果查找数字5,由于数组不含有该数字,则返回false。
 
我的解题思路是这样的矩阵行列都是从小到大排好序的,要查找的话自然用二分效率比较高,
而且这样的矩阵有个性质,最左上角的元素必定是最小值,最右下角的是最大值,在一个
n*n的矩阵中,对角线的元素也是排好序的,找到对角线上的一个元素,使得这个元素小于
待查找的key,并且下一元素大于待查找的key,那么只要在这个元素的左下角矩阵和右上角
矩阵递归继续对角线查找就可以了,例如上图例子里查找7,只要找到对角线的元素4,然后
递归查找红圈的矩阵就可以了,左上角矩阵最大值4<7,右下角
矩阵最小值10>7,无需查找了,但是此题并没有告诉我们原始矩阵是n*n的,这是比较麻烦的
地方,不过思路是一样的,无非不能用对角线查找这样简单的办法了,假设m*n的矩阵,对角线
查找的办法改进为i = (m1+m2)/2,j = (n1+n2)/2 进行查找就可以了,(m1,n1)为矩阵最左上角
元素下标,(m2,n2)为最右下角元素下标
假设查找17,第一次比较10,然后比较25,然后比较13,返回元素13,这时候再递归查找13
左下角的矩阵和右上角的矩阵就可以了(红色椭圆部分);如果是查找9,第一次比较10,然后比较4,
然后比较6,返回元素6,这时候递归查找6左下角的矩阵和右上角矩阵(绿色椭圆部分)
代码如下:
a是二维数组首地址,(m1, n1)左上角坐标,(m2, n2)右下角坐标,参数n是矩阵一行的元素个数
int binsearch(int value, int *a, int n, int m1, int n1, int m2, int n2)
{
        int begin_m1 = m1, begin_n1 = n1, end_m2 = m2, end_n2 = n2;
        int left_result = 0,  right_result = 0;
        int i = (m1+m2)/2, j = (n1+n2)/2;
        if (a == NULL)
                return 0;
        if (value < *(a+m1*n+n1) || value > *(a+m2*n+n2))
                return 0;
        else if (value == *(a+m1*n+n1) || value == *(a+m2*n+n2))
                return 1;
 
        while ((i!=m1 || j!=n1) && (i!=m2 || j!=n2)){
                 if ( value == *(a+i*n+j) )
                         return 1;
                 else if ( value < *(a+i*n+j) ){
                         m2 = i;
                         n2 = j;
                         i = (i+m1)/2;
                         j = (j+n1)/2;
                  }
                 else{
                         m1 = i;
                         n1 = j;
                         i = (i+m2)/2;
                         j = (j+n2)/2;
                 }
           }
          
           //search left & right
           if ( i<end_m2 )
                   left_result = binsearch(value, a, n, i+1, begin_n1, end_m2, j);
           if ( j<end_n2 )
                   right_result = binsearch(value, a, n, begin_m1, j+1, i, end_n2);
           if (left_result | right_result )
                   return 1;
           else
                   return 0;
}
 
2025浏览器指纹伪装终极指南:Playwright修改WebGL+时区+分辨率,小红书爬1000条零验证 2025年小红书的反爬已经进入“多维校验”时代,单纯修改某一个指纹维度已失效。本文方案的核心是“让所有特征都一致且合理”——WebGL+Canvas+时区+分辨率+UA+行为,形成一个完整的“真实用户画像”,让小红书的反爬系统无法区分是爬虫还是真人。这套方案不仅适用于小红书,也可迁移到知乎、抖音、跨境电商等其他高反爬平台,只需替换对应的指纹库和数据提取逻辑。记住:指纹伪装的本质不是“欺骗”,而是“模拟真实”,把每个细节都做到和人类一致,自然就能实现“零验证”爬取。 阅读详情

相关推荐

TCS34725颜色识别模块实战调校:从“一坨”例程到精准RGB

本文针对TCS34725颜色识别模块初始数据不准的问题,提供了从基础例程到精准调校的实战指南。核心在于通过白光校正与黑白光校正两种方法,补偿传感器偏差与环境光影响,将原始数据准确映射为标准RGB值。文章详细阐述了校准原理、操作步骤与代码实现,并分享了进阶调试技巧与避坑指南,帮助开发者显著提升颜色识别的准确性与项目可靠性。

weixin_29188043的博客 287

二维数组查找

近日微博上看到一个题目,二维数组查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true; 如果查找数字5,由于数组不含有该数字,则返回false。   我的解题思路是这样的矩阵

expp的专栏 2428

BEVFusion(mit)最强环境安装,部署复现

BEVFusion作为一项经典的工作,值得深入探索。然而由于配置环境比较麻烦,耽误了一些时间。经过几次成功配置之后,有了一些总结,在这里记录下来,供大家参考避坑,也方便自己下次查阅。

qq_45783225的博客 1万+

二维数组中的查找(二分查找)

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ] 给定 target =...

weixin_61898526的博客 1289

CMOS 半加器和全加器&&数字集成电路&& Cadence Virtuoso

数字集成电路——半加器和全加器

计科小学生的博客 1万+

MT6768平台Sensor Bring Up全流程实战:从驱动添加到问题排查(附避坑指南)

本文详细介绍了联发科MT6768平台Sensor Bring Up的全流程实战指南,从驱动添加、硬件配置到问题排查,提供了全面的避坑建议。内容涵盖环境准备、驱动文件集成、硬件接口配置、编译系统适配以及常见问题解决方案,帮助开发者高效完成传感器集成与调试工作。

weixin_30374009的博客 416

【二分法】二维数组中的查找

题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 对于二维数组:[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]] 给定 target= 7,返回true。 给定target=3,返回false。 方法一:直接遍历 效率低,时间复杂度太高 方法二:二分法 1 2 8 9 ...

hr786250678的博客 784

World Creator地形导入UE

导出预设选择高度图(heigh map)格式选择PNG 16位,或者RAW 16位,需要反转y轴(与虚幻不同),命名格式会自动带一个× , 将×改成_ 或者删掉自己命名 (虚幻名称不支持x符号)导入虚幻 , 修改Z轴 , 就是用 地形最高 - 地形最低 , 然后除以512 , 再乘以100。把这个数字填入Z轴缩放 , 点击生成即可。

UE星空 2154

二维数组中的元素查找(二分法的运用)

1、vector知识 参考这篇博文,写得不错(https://blog.youkuaiyun.com/weixin_41743247/article/details/90635931) 2、用vector来表示二维数组 vector<vector > array(3);//定义了行数为3列数不定的二维数组 array.size()//返回二维数组的行数 array[0].size()//返回二维数组第一行的列数 定义一个行列固定的二维vector数组 例: vector<vector<int&

weixin_42628517的博客 837

基于LTspice的共模电感差模/共模插入损耗仿真指南

在电源与EMC设计领域,插入损耗是衡量滤波器件抑制噪声能力的核心指标。共模电感作为EMI滤波器中最常见的元器件之一,其差模与共模插入损耗特性直接影响整体滤波方案的合规性。然而,仅依赖规格书曲线往往难以覆盖真实应用中的阻抗条件,借助SPICE仿真工具进行电路级验证已成为工程师常用的手段。LTspice凭借其轻量、高效的交流分析能力,能够帮助设计者快速搭建共模电感等效模型,并通过调整耦合系数、寄生电容等参数,还原漏感与谐振行为。本文以Wurth Elektronik的WE 744821201型号为例,从基本测试

weixin_27252001的博客 293

网络安全实战:从Wireshark到BurpSuite的抓包技巧解析

本文深入解析了Wireshark和BurpSuite在网络安全抓包中的实战技巧,从基础对比到高级过滤、核心模块应用及安全测试避坑指南。通过详细的操作步骤和案例分析,帮助读者掌握数据包抓取与分析的核心技能,提升网络安全防护能力。

weixin_29207533的博客 572

【力扣每日一题、74搜索二维矩阵】二分查找法在二维数组上的应用

原题链接 题目 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性: 每行中的整数从左到右按升序排列。 每行的第一个整数大于前一行的最后一个整数。 示例 解题思路 早上起来看力扣每日一题,看到只是搜索某值,这该是个简单题的。原本我还理解错意思了,以为要判断是增矩阵和找到target,哈哈。后来只是要查找到target就行了,如果暴力的直接两层for循环就可以搞定。但是题目给的明显是有顺序的二维数组,我们直接使用二分查找法,二分查找法在一维数组上写起来很容易,但是在二

VanGotoBilibili的博客 1956

STM32G4 电机外设篇(三) TIM1 发波 和 ADC COMP DAC级联

STM32G4电机控制外设应用笔记摘要:本文详细介绍了TIM1高级定时器生成三对互补PWM波的配置方法(预分频器PSC=30000,重装载值ARR=10000),重点说明需断开电机连线避免干扰。通过STM32CubeMX配置TIM1通道4触发ADC采样,设置RCR分频参数,并给出Keil代码修改要点。第二部分探讨了TIM1、ADC、比较器和DAC的级联应用,包括电流采样触发时序(在PWM波峰值前采样)和过流保护机制。配置步骤包含DAC3作为比较器负输入端、设置Break触发封波保护,并附关键代码段实现外设联

qq_43091070的博客 1101

【二分法整理】二维数组中的查找

在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

zhutier 189

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【二分法】剑指offer:二维数组中的查找

对于二维数组中每一个一维数组,用二分查找,判断能否找到该数leetcode专题笔记:二分法查找(1)(附leetcode题)_m0_52043808的博客代码:登录后复制 class Solution { public: bool binsearch(int target,vector<int>arr...

weixin_36033417的博客 122

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【BM18-二分法】二维数组中的查找

所以,我们可以以左下角为起点,如果它小于target,则往右移找更大的;这道题因为每一行从左到右都是递增的,且每一列从上到下也都是递增的。左下的元素大于它上方的元素,小于它右方的元素。如果它大于target,则往上移找更小的。我们不难发现,左上角是。

博客 226

[剑指-Offer] 4. 二维数组中的查找(数学、二分法)

文章目录1. 题目来源2. 题目说明3. 题目解析3.1 方法一:暴搜3.2 方法二:数学规律法 1. 题目来源 链接:二维数组中的查找 来源:LeetCode——《剑指-Offer》专项 2. 题目说明 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例 : ...

Y-puyu 的博客 388

枚举&&二分法&&剑指 Offer 04. 二维数组中的查找

目的:从每行每列都递增的二位数组中查找target。 1.枚举(最简单的方法,O(n^2)时间复杂度,忽略了行列递增排序的条件 2.二分法(对每一行都二分查找,O(n^logn)时间复杂度,但是忽略了列递增的条件 写了半天,原来是return true的if条件需要判断边界值left和right防止溢出,二分法没写错。 class Solution { public: //二分查找+遍历,将双重循环的O(n^2)时间复杂度降到O(n*logn) bool findNumberIn2DArra

中流击水,浪遏飞舟 138

剑指offer 01 二维数组中的查找(二分法)

题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思想 初步:先从第一行中找到列的位置,然后往下找。 应该是用二分法,确定二分的头和尾。 代码 public class Solution { public boolean Find(int target, int [][] array) { int row = a.

R的博客 110

剑指 Offer 04. 二维数组中的查找(Java、标志数、二分法)

剑指 Offer 04. 二维数组中的查找(Java、标志数、二分法)

weixin_45512600的博客 202

剑指 Offer 04. 二维数组中的查找(python)二分法

题目描述: 先写一个二分查找函数,二分查找函数的返回写成中间数的索引。 步骤如下: 1、先二分查找第一列(如果有的话),返回第一列小于等于target的索引。 2、如果对应值不为target,就开始使用二分法遍历索引值前的每一行(如果有的话)。 class Solution: def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool: line_list = [] #判

qq_44494246的博客 512

剑指 Offer 04.二维数组中的查找(二分法和普通遍历)

方法一:采用二分查找法 class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return false; for (int i = 0; i < matrix.length; i++) {

A2460865183的博客 169
上一篇: 细数那些令人发狂的程序语言的特性
下一篇: 网上支付原理
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值