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

ops/2025/1/19 3:59:15/

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大于矩阵中最大的数,那就不用搜索了,肯定不在。

java">        //判断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就处在那个数所在的行。

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

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

java">        //左右指针和二分指针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.代码展示

java">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.ppmy.cn/ops/151267.html

相关文章

向harbor中上传镜像(向harbor上传image)

向 Harbor 中上传镜像通常分为以下几个步骤&#xff1a; 1、登录 Harbor 2、构建镜像 3、标记镜像 4、推送镜像到 Harbor 仓库 1、登录 Harbor 首先&#xff0c;确保你已经能够访问 Harbor&#xff0c;并且已经注册了账户。如果还没有 Harbor 账户&#xff0c;你需要先注册一…

1.6 阅读k8s源码的准备工作

准备工作 找个合适的ide 比如goland 下载k8s源码 项目地址 https://github.com/kubernetes/kubernetes可以git下载&#xff0c;也可以下载zip包&#xff0c;还可以go get 下载 git clone https://github.com/kubernetes/kubernetes.git 本教程基于k8s 1.21 版本 k8s组件代…

Java语言的软件工程

Java语言的软件工程 引言 在当今信息技术飞速发展的时代&#xff0c;软件工程作为一门应用广泛的学科&#xff0c;承担着开发高质量软件系统的重要责任。Java语言以其跨平台特性、安全性和强大的库支持&#xff0c;已经成为软件工程领域中最流行的编程语言之一。本文将深入探…

装饰器模式详解(附代码案例和源码分析)

目录 装饰器模式的本质 装饰器模式和继承结构的对比 源码中IO流的继承结构 具体装饰器类 装饰器的组合应用 装饰器链的特点 代码案例 定义coffee类型 coffee的实现类 装饰器抽象类 装饰器 - 季节限定 装饰器——加牛奶 装饰器——加糖 生成咖啡的简单工厂 咖…

H3CNE-11-生成树协议STP

STP&#xff1a;Spanning Tree Protocol&#xff0c;可以在提高可靠性的同时又能避免环路带来的各种问题。 一句话总结STP的作用&#xff1a;防止交换机环路。 为了提高网络的可靠性&#xff0c;交换网络中通常会使用冗余链路&#xff0c;然而冗余链路会给交换网络带来环路风险…

高通8255 Android STR 启动失败要因分析调查

目录 背景&#xff1a; 调查过程&#xff1a; 步骤1&#xff1a; slog2info | grep vmm_service 步骤2&#xff1a; slog2info | grep qvm 总结&#xff1a; 解决方案 背景&#xff1a; 调试高通8255 STR的STR过程中发现Android和QNX进入STR状态后&#xff0c;脱出STR时…

Bootstrap 下拉菜单

Bootstrap 下拉菜单 Bootstrap 是一个流行的前端框架&#xff0c;它提供了许多预构建的组件&#xff0c;其中之一就是下拉菜单。下拉菜单是一个交互式元素&#xff0c;允许用户从一系列选项中选择一个。在本篇文章中&#xff0c;我们将详细介绍如何在 Bootstrap 中创建和使用下…

Android SystemUI——车载CarSystemUI加载(八)

Android 系统早期的状态栏和导航栏对于手机设备来说那是相当重要的,但是随着手机版本的不断更新,状态栏和导航栏对于手机的重要性在逐渐降低,特别是在快捷手势出现之后,导航栏几乎变得可有可无。但是对于当前如火如荼的车载系统来说,状态栏和导航栏却几乎是必备的,谷歌自…