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

LeetCode100之搜索二维矩阵(46)--Java

1.问题描述

        给你一个满足下述两条属性的 m x n 整数矩阵:

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

        给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

        示例1

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

        示例2 

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

        提示

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -104 <= matrix[i][j], target <= 104

        难度等级

        中等

        题目链接

        搜索二维矩阵

2.解题思路

        这道搜索二维矩阵的题比较常规,话不多说,直接开干。

        因为这是一个已经排好序的二维矩阵,每一行的第一个整数一定大于上一行的所有整数,所以我们可以先判断target是否在这个矩阵内,再进行搜索。如果target小于矩阵中最小的数或者target大于矩阵中最大的数,那就不用搜索了,肯定不在。

        //判断target是否小于矩阵中最小的数if(matrix[0][0] > target){return false;}//判断target是否大于矩阵中最大的数if(matrix[matrix.length-1][matrix[0].length-1] < target){return false;}

        接着,我们根据矩阵递增的特征,通过比较每一行的最后一个数与target的大小关系,可以定位到target可能处于矩阵的哪一行,用一个循环不断比较,当出现第一个大于或等于target的数时,target就处在那个数所在的行。

        //判断target可能位于哪一行矩阵中int row = 0;while(row < matrix.length && matrix[row][matrix[0].length-1] < target){row++;}

        然后,就是对我们找到的这一行进行常规的二分查找了,设置左右指针和二分指针,不断比较二分值与target的关系,不断缩小查找的范围,直到最终找到target的位置或者左右指针越界。

        //左右指针和二分指针int left = 0;int right = matrix[row].length - 1;int mid = 0;//判断target是否真的在我们筛选出来的矩阵中while(left <= right){//更新二分指针mid = (right - left) / 2 + left;//判断中间值是否为我们要找的数if(matrix[row][mid] == target){return true;}//若中间值小于目标值if(matrix[row][mid] < target){left = mid + 1;}//若中间值大于目标值if(matrix[row][mid] > target){right = mid - 1;}}

        最后,根据查找结果返回对应的答案即可。

3.代码展示

class Solution {public boolean searchMatrix(int[][] matrix, int target) {//判断target是否小于矩阵中最小的数if(matrix[0][0] > target){return false;}//判断target是否大于矩阵中最大的数if(matrix[matrix.length-1][matrix[0].length-1] < target){return false;}//判断target可能位于哪一行矩阵中int row = 0;while(row < matrix.length && matrix[row][matrix[0].length-1] < target){row++;}//左右指针和二分指针int left = 0;int right = matrix[row].length - 1;int mid = 0;//判断target是否真的在我们筛选出来的矩阵中while(left <= right){//更新二分指针mid = (right - left) / 2 + left;//判断中间值是否为我们要找的数if(matrix[row][mid] == target){return true;}//若中间值小于目标值if(matrix[row][mid] < target){left = mid + 1;}//若中间值大于目标值if(matrix[row][mid] > target){right = mid - 1;}}//若循环结束还是没有找到,说明target不在矩阵中return false;}
}

4.总结

        这道题,如果对二分查找熟练的话,其实理解起来不难,要做出来也不难,只要定位到target在矩阵的哪一行,就变成了常规的二分查找了。这道题就简单水到这里,祝大家刷题愉快,早日拿到心仪的offer~

http://www.lryc.cn/news/521497.html

相关文章:

  • 学员答疑:安卓分屏窗口的TouchableRegion设置流程追踪
  • [cg] UE5 调试技巧
  • Python Wi-Fi密码测试工具
  • Linux 创建用户
  • 自建RustDesk服务器
  • Spring Boot Web技术栈(官网文档解读)
  • 【llama_factory】qwen2_vl训练与批量推理
  • wpa_cli命令使用记录
  • 【Uniapp-Vue3】页面生命周期onLoad和onReady
  • 《C++11》并发库:简介与应用
  • LeetCode - #183 Swift 实现查询未下订单的客户
  • HTML拖拽功能(纯html5+JS实现)
  • mysql 等保处理,设置wait_timeout引发的问题
  • 7.STM32F407ZGT6-RTC
  • 重写(补充)
  • 30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <3>5分钟集成好druid并使用druid自带监控工具监控sql请求
  • 【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理
  • Oracle 分区索引简介
  • 【科技赋能未来】NDT2025第三届新能源数字科技大会全面启动!
  • Broker收到消息之后如何存储
  • Mysql--实战篇--SQL优化(查询优化器,常用的SQL优化方法,执行计划EXPLAIN,Mysql性能调优,慢日志开启和分析等)
  • BERT与CNN结合实现糖尿病相关医学问题多分类模型
  • rabbitmqp安装延迟队列
  • 深入探讨DICOM医学影像中的MPPS服务及其具体实现
  • 集合帖:区间问题
  • C#,入门教程(27)——应用程序(Application)的基础知识
  • 迅翼SwiftWing | ROS 固定翼开源仿真平台正式发布!
  • CSS 样式 box-sizing: border-box; 详细解读
  • FLASK创建下载
  • 漫话架构师|什么是系统架构设计师(开篇)