算法 查找 【剑指 Offer 04 二维数组中的查找】

【算法】剑指 Offer 04. 二维数组中的查找 【重刷】 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 = 阅读详情

一、题目描述

在一个 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 = 5,返回 true。

给定 target = 20,返回 false。

限制:

0 <= n <= 1000

0 <= m <= 1000

 

二、思路

最简单的思路肯定是一一遍历。但是这样的时间复杂度很高,我们需要设计一个更高效的算法,所以需要先研究该二维数组:

题目中有这样一句话:每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。

也就是说,右上角的元素是第一行元素中最大的,同时是最后一列元素中最小的。

右上角元素的左边第一个元素是第一行元素中次大的,同时是倒数第二列元素中最小的。

整理可得:第一行第m列元素是第一行第m大的,同时是第m列中最小的。

那么我们可以拿目标和第一行最后一列的元素进行比较,比较顺序为从右至左。

举个例子:

假如我们要找8,8比15小,说明8所在的列在15所在列的左侧,那么接下来和11比;

8比11小,说明8所在的列在11所在列的左侧,那么接下来和7比;

8比7大,证明如果矩阵中存在8,那么8肯定与7同列,且在7的下方。那么接下来将行增加一行,进行比较;

最终找到了8。

那么对于找不到的元素呢?

我们可以设置一个循环,假设一开始就找不到,设置一个flag = 0;如果找到了就设置flag = 1,然后跳出循环;

如果还是找不到,那么需要一个结束循环的条件:行超过了最大行,或者列为负数。

 

三、代码

class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        bool found = false;
        //如果数组为空,肯定找不到
        //一共matrix.size()行
        //matrix[0].size()列
        if (matrix.empty())
        {
            return found;
        }
        //最大行
        int rows = matrix.size();
        //最大列
        int columns = matrix[0].size();

        //当前元素从右上角开始
        //当前行设置为0
        int row = 0;
        //当前列设置为列的边界,因为数组下标从0开始,所以边界为最大列-1
        int column = columns-1;
        //循环条件:行没有超过最大行,列没有为负数
        while (row < rows && column >= 0)
        {
            //如果找到目标,即返回
            if (target == matrix[row][column])
            {
                found = true;
                break;
            }
            //如果目标比当前元素小,而当前元素又是该列中最小的,所以往左缩短一列
            else if (target < matrix[row][column])
            {
                column--;
            }
            //如果在目标元素已经小于右边所有元素的情况下,目标元素又比当前元素大,说明目标元素在当前元素下方,所以往下增加一列
            else
            {
                row++;
            }
        }
        return found;

    }
};

 

 

 

 

 

硅谷刷屏的ClawdBot,让Mac mini卖爆了!创始人爆料:一人开发、100% AI 写代码 这两天,个人 AI 助手 ClawdBot 席卷硅谷,国内外社交平台上全是关于它的讨论。 在试用后,网友们纷纷给出了很高的评价。“它是迄今为止最伟大的 AI 应用,相当于你 24 小时全天候专属 AI 员工。”Creator Buddy 创始人兼 CEO Alex Finn 盛赞道,“这就是他们 (Anthropic) 希望 Claude Cowork 呈现的样子。” 阅读详情

相关推荐

无人驾驶之车辆控制(1)纯跟踪(Pure Pursuit)算法与Stanley算法

目录引言1 Pure Pursuit纯几何跟踪算法1.1 车辆运动学自行车模型1.2 算法原理1.3 仿真测试2 Stanley算法2.1 算法原理2.2 仿真测试3 总结 引言 本文对Pure Pursuit以及Stanley control两种算法进行了调研以及初步的性能摸底。 1 Pure Pursuit纯几何跟踪算法 1.1 车辆运动学自行车模型 运动学是从几何学的角度研究物体的运动规律,...

zxxxxxxy的博客 2万+

求的数组的topN

/** 查找最小的k个元素 题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4 **/ #include #include #include //swap void swap(int& left,int& right) { int tem=left; left=right; right=tem; } //sh

leewon1988的专栏 1260

量化人必看|miniQMT踩坑记:回测太慢?一招教你把行情数据“搬回家”!

这篇文章主要聊的是。

奔跑的蜗牛 3479

贪心之二维数组排序

每日一题ing,今天是个medium题406. 根据身高重建队列 class Solution { public: static bool cmp(const vector<int> a, const vector<int> b) { if (a[0] == b[0]) return a[1] < b[1]; return a[0] > b[0]; } vector<vector<int>>

Douglas_LT的博客 514

手把手教你安装 Vivado2022.2(附安装包)

Vivado 2022.2版本与之前的版本相比,具有以下几个显著的优势:电源设计管理器(PDM):Vivado 2022.2引入了全新的电源设计管理器(PDM),这是一个下一代功耗评估平台,为Versal® 和 Kria™ SOM提供了准确一致的功耗估计能力。PDM是Versal产品家族的首选功耗评估工具,为Versal ACAP硬IP块提供增强向导,简化从XPE向PDM的迁移,帮助用户获得准确的功耗评估。

dpwkj的博客 2万+

ZYNQ平台AXI DMA传输避坑指南:如何快速定位‘errors:200‘等中断故障

本文详细解析了ZYNQ平台AXI DMA传输中常见的'errors:200'等中断故障,提供了从寄存器解析到压力测试的完整解决方案。通过深入分析XILINX_DMA中断机制、错误分类及五步排查法,帮助开发者快速定位并解决DMA传输问题,提升系统稳定性与性能。

weixin_29159613的博客 441

N个有序数组的TOPK问题

N个有序数组的TOPK问题 假设K个N元素的有序数组,求解最小的TOPK问题的C语言实现 //求解N个元素的大小的K个数组里面的TOPK小元素 #include <iostream> using namespace std; #define K 3 #define N 4 #define TOPK 10 #define MaxValue SHRT_MAX //升序数组 short matrix[K][N] = { { 37,89,101,189 } , { 23,56,897,7

qq_39309050的博客 2083

IMU预积分【SLAM】

预积分的推导过程比较多,所以这里只记录关键结论。 其实这些公式不太好记忆,因为预积分推导过程的想法来源很巧妙,无法看出物理意义。一切推导的来源: 最好记忆的旋转相对运动量: △Rij≐RiTRj=∏k=ij−1Exp((ω~k−bg,k−ηgd,k)△t)\triangle R_{ij} \doteq R_{i}^{T}R_{j} = \prod_{k=i}^{j-1}Exp((\tilde{\omega}_{k}-b_{g,k}-\eta_{gd,k})\triangle t) △Rij​≐RiT​Rj​

Tong_1024_的博客 1373

topk:数组中的k项最大值//二维数组中的k项最大值

topk:数组中的k项最大值//二维数组中的k项最大值暴力解法快排解法堆排解法堆排获取包含n堆数组的前k项 暴力解法 这个基本思路类似于冒泡排序或者插入排序,以此遍历找到最大的数,最后返回k个最大的数,时间复杂度为 O(NK)O(NK)O(NK) 形如: def getTopk(li,k): for i in range(k): start=0 for j ...

redtongue的博客 980

SRS(简单实时视频服务) 笔记(5)- 视频录制

在SRS使用中实现视频录制功能。

irainsa的博客 1700

银河麒麟服务器操作系统V10SP3 U盘安装中“基础软件仓库错误”的排查与修复指南

本文针对在无网络环境下使用U盘安装银河麒麟服务器操作系统V10SP3时,遇到的“基础软件仓库错误”问题,提供了详细的排查与修复指南。核心解决方案是通过进入救援模式,使用lsblk命令确定U盘实际设备路径,并在系统引导时手动添加inst.repo内核参数来指定安装源,从而绕过安装程序的自动探测故障,确保安装流程顺利进行。

ik67890123的博客 1197

算法:数组基本有序如何排序/找出topk 数组,思想一致

1.已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。   思路1:数组若是基本有序的话,最好是插入排序,时间复杂度为O(NK),N为数组长度,K是需要移动的数的最远距离不超过K。 参考多个数组排序一节 思路2:另外堆排序也可以用,选择堆起始大小为k的最小堆排序算法,每个元...

m0_37780420的博客 3660

世界模型(World Models)进展全景调研(截至 2025-08)

A5) 2019-07(待核验) | C-SWM:Contrastive Structured World Models(Kipf et al.)A6) 2019-07(待核验) | SLAC:Stochastic Latent Actor-Critic(Lee et al.)A3) 2015-12(背景注记,待核验) | Embed to Control(E2C,Watter et al.)Nature 2020)Repro/Code:werner-duvaud/muzero-general(社区)

u013250861的博客 489

LeetCode-Book《剑指 Offer 04. 二维数组中的查找》详解:标志数与行列消去的最优查找算法

本篇基于 LeetCode-Book 仓库 `sword_for_offer` 模块的题解文档与配套代码,详解《剑指 Offer》第 04 题“二维数组中的查找”的最优解法:如何利用“每行从左到右递增、每列从上到下递增”的矩阵性质,以左下角元素为标志数,通过行列消去实现 $O(M+N)$ 的查找,并逐语言对照仓库中的 Python / Java / C++ 参考实现与测试用例。读完后你将掌握这套从

gitblog_00825的博客 677

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

算法——剑指 Offer 04. 二维数组中的查找

剑指 Offer 04. 二维数组中的查找 原题链接 题目: 在一个 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,

知北行的博客 119

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

力扣剑指Offer 第5天 查找算法(中等) 剑指 Offer 04. 二维数组中的查找 剑指 Offer 11. 旋转数组的最小数字 剑指 Offer 50. 第一个只出现一次的字符

力扣剑指Offer 第5天 查找算法(中等) 剑指 Offer 04. 二维数组中的查找 剑指 Offer 11. 旋转数组的最小数字 剑指 Offer 50. 第一个只出现一次的字符 剑指 Offer 04. 二维数组中的查找 题目 在一个n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15]

Ctrl_kun的博客 4552

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

剑指Offer 04. 二维数组中的查找-【算法基础】

微信公众号同步更新 欢迎和小白一起成长,985计算机硕士,有任何学习,保研等问题都可以公众号私信留言哦! 微信搜索:三喂树屋 剑指offer刷题系列[04],欢迎一起学习 题目描述 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19]

wbxd 182

【算法】剑指 Offer 04. 二维数组中的查找(标志数法)

问题来源 剑指 Offer 04. 二维数组中的查找 在一个 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, 2

weixin_43868754的博客 238

【查找算法】剑指 Offer 04. 二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。:若使用暴力法遍历矩阵 matrix ,则时间复杂度为 O(NM)。暴力法未利用矩阵 “从上到下递增、从左到右递增” 的特点,显然不是最优解法。给定 target = 20,返回 false。给定 target = 5,返回 true。

Rolandxxx的博客 222

【算法】剑指Offer04-二维数组中查找

剑指Offer04-二维数组中查找1.题目2.思路3.答案 1.题目 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13,

Rose J 的博客 150

手撕算法 剑指 Offer 04二维数组中的查找

问题:二维数组中的查找 问题详情: 在一个 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] ...

leo_zexin的博客 202

Golang算法-二维数组查找(剑指 Offer 04. 二维数组中的查找)

剑指 Offer 04. 二维数组中的查找 //给二维数组赋值方式 //var a = [][]int{ // {1,3,4,5}, // {2,5,6,8}, //} //这就构成了一个2行4列的二维数组 func findNumberIn2DArray(matrix [][]int, target int) bool { rows := len(matrix) //特殊条件 if rows == 0 { return false } column := len(matrix[0]

weixin_53970851的博客 396

【算法-剑指 Offer】04. 二维数组中的查找(数组方法;排序;二分查找)

剑指 Offer 04. 二维数组中的查找 - 力扣(LeetCode) 文章更新:2021年10月12日10:00:53 问题描述及示例 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22],

赖念安的博客 351

算法训练||剑指 Offer 04. 二维数组中的查找

方法一:通过每一次比较当前所剩区域的右上角和目标值的大小来进行判断 如果右上角的元素等于target,返回true 如果右上角的元素小于target,删除右上角元素所在的行 row++ 如果右上角的元素大于target,删除右上角元素所在的列 col– class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if(matrix.length == 0||matrix[0].

weixin_45394002的博客 214

算法 |《剑指offer》面试题 04. 二维数组中的查找

在一个 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 = 5,返回 true。 给定 target = 20,返回

RyanCYK的计算机世界 139

python刷算法 LeetCode 剑指offer 04 二维数组中的查找

在一个 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 = 5,返回 t

weixin_44968944的博客 162
上一篇: 算法 动态规划 【最长回文子串】
下一篇: 算法 动态规划 【机器人路径问题】
Kukeoo
博客等级 码龄8年 216粉丝 170原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值