当前位置: 首页 > news >正文

【一刷《剑指Offer》】面试题 3:二维数组中的查找

 力扣对应题目链接:240. 搜索二维矩阵 II - 力扣(LeetCode)  

核心考点:数组相关,特性观察,时间复杂度把握。


一、《剑指Offer》对应内容


二、分析题目

  1. 正常查找的过程本质就是排除的过程,谁排除的效率更高,谁对应查找的效率也就更高。
  2. 如果双循环查找,本质是一次排除一个,效率过低。但采取从右上角 / 左下角进行比较,这样就可以一次排除一行或一列。
  3. 注意临界条件。

三、代码(C++)

1、从右上角开始排查

//从右上角开始排查
class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int i=0, j=matrix[0].size()-1;while(i<matrix.size() && j>=0){if(matrix[i][j]>target)j--;else if(matrix[i][j]<target)i++;else return true;}return false;}
};

注意:本题因为所提供数据范围为:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= n, m <= 300

所以,排除了空数组的情况,否则还需要在开头进行特判。

例如,下面这道题目:LCR 121. 寻找目标值 - 二维数组 - 力扣(LeetCode)

//从右上角开始排查
class Solution {
public:bool findTargetIn2DPlants(vector<vector<int>>& plants, int target) {if(plants.size()==0 || plants[0].size()==0) return false;int i=0, j=plants[0].size()-1;while(i<plants.size() && j>=0){if(plants[i][j]>target)j--;else if(plants[i][j]<target)i++;else return true;}return false;}
};

注意:如果采用第二种方法:“从左下角开始排查”,则不需要进行特判,因为如果数组为空,第二种方法并不会进入到循环当中。

//从左下角开始排查
class Solution {
public:bool findTargetIn2DPlants(vector<vector<int>>& plants, int target) {int i=plants.size()-1, j=0;while(i>=0 && j<plants[0].size()){if(plants[i][j]>target)i--;else if(plants[i][j]<target)j++;else return true;}return false;}
};

2、从左下角开始排查

//从左下角开始排查
class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int i=matrix.size()-1, j=0;while(i>=0 && j<matrix[0].size()){if(matrix[i][j]>target)i--;else if(matrix[i][j]<target)j++;else return true;}return false;}
};
http://www.lryc.cn/news/338590.html

相关文章:

  • Linux下静态库与动态库使用总结
  • 分布式任务调度:架构、原理与实践
  • ping命令返回无法访问目标主机和请求超时浅析
  • 地球上的七大洲介绍
  • IntelliJ IDEA 2024 for Mac/Win:引领Java开发新纪元的高效集成环境
  • Java 中命令模式,请用代码具体举例
  • 低延时+高并发+强事务丨DolphinDB 交易型内存存储引擎 IMOLTP 使用指南
  • 写代码的修养
  • springboot 问题整合
  • UNIAPP二维码展示页亮度调至最亮返回恢复进入前亮度
  • Golang ProtoBuf 初学者完整教程:安装
  • Isolation Forest 简介
  • Java爬虫携带sign签名
  • 设计者模式之中介者模式(下)
  • SAP SD学习笔记04 - 出荷Plant(交货工厂),出荷Point(装运点),输送计划,品目的可用性检查,一括纳入/分割纳入,仓库管理
  • bind包装器——C++新特性(三)
  • MXNet的下载安装及问题处理
  • Python 中的列表排序和排序规则
  • 面经整理1
  • ChatGPT个人专用版 SSRF漏洞复现(CVE-2024-27564)
  • Python中的可哈希与不可哈希对象详解
  • 【嵌入式DIY实例】-DIY速度计
  • 1.0 Hadoop 教程
  • 【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波(文末附3个算法源码)
  • 智能水务系统:构建高效节水的城市水网
  • 【JavaEE初阶系列】——网络编程 UDP客户端/服务器 程序实现
  • 数据结构复习指导之绪论(算法的概念以及效率的度量)
  • C语言经典例题(23)
  • Gitea的简单介绍
  • Qt信号与槽