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

240.搜索二维矩阵

·题目描述

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

示例 1:

输入: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

示例 2:

输入: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 = 20
输出:false

·解题思路

想编写一个二维二分查找的算法,就是说将二维矩阵分为四个象限,根据中间值的大小判断要搜索的区域。但是每次对比完还需要查找余下三个象限的值,时间耗费比较多。

----如果想做该算法,需要搞清楚的事情是。当中间值   小于  target时候,需要查找的三个象限为左上、左下、右上;当中间值   大于   target  的时候,需要查找的三个象限为右上、左下、右下。

·Java代码


class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length, n = matrix[0].length;for(int i = 0; i < m ; i ++){int[] temp = matrix[i];if(find(temp, target, 0, n - 1)){return true;}}return false;}public static boolean find(int[] arr, int target, int lo, int hi ) {if(lo > hi ) return false;int mid = lo + (hi - lo ) / 2;if(arr[mid] == target){return true;}else if(arr[mid] > target){return find(arr, target, lo, mid - 1);}else{return find(arr, target, mid + 1, hi);}}
}

------耗时太长了,还不如每一行使用二分查找。但是做一点点小小的优化,只有当每一行的第一个元素   小于   target , 并且  最后一个元素   大于   target  的时候,才进行二分查找。

·Java 代码

class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length, n = matrix[0].length;for(int i = 0; i < m ; i ++){int[] temp = matrix[i];if(temp[0] <= target && temp[n - 1] >= target){if(find(temp, target, 0, n - 1)){return true;}}}return false;}public static boolean find(int[] arr, int target, int lo, int hi ) {if(lo > hi ) return false;int mid = lo + (hi - lo ) / 2;if(arr[mid] == target){return true;}else if(arr[mid] > target){return find(arr, target, lo, mid - 1);}else{return find(arr, target, mid + 1, hi);}}
}

当然还有一个暴力遍历求解就不说了。

相关文章:

  • 开发指南027-微信支付
  • HR招聘面试测评,测评候选人的语言和表达能力
  • 数字化转型中存在的五大问题:意识、供给、成本、能力、竞争力培育
  • Linux命令locate:快速定位文件与目录
  • IO转换流
  • EasyRecovery数据恢复软件具有哪些功能特点?2025版本啥时候更新
  • 大数据学习问题记录
  • 一文读懂筛选控件设计
  • Python深度学习基于Tensorflow(16)基于Tensorflow的对话实例
  • python中有时使用pip安装库而有时又使用conda安装库,到底应该使用哪个管理工具进行库的安装呀?
  • SVG画双色虚线并带有流动效果
  • Java - 随机存取文件类
  • c++自定义定时器
  • Flutter基础 -- Flutter容器布局
  • 【Redis】Hash介绍与应用详解
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CentOS7简单部署NFS
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript学习总结——原型
  • orm2 中文文档 3.1 模型属性
  • Spring核心 Bean的高级装配
  • Wamp集成环境 添加PHP的新版本
  • 高程读书笔记 第六章 面向对象程序设计
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 小程序开发之路(一)
  • 大数据全解:定义、价值及挑战
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • #FPGA(基础知识)
  • #pragam once 和 #ifndef 预编译头
  • #宝哥教你#查看jquery绑定的事件函数
  • $.ajax,axios,fetch三种ajax请求的区别
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转) 深度模型优化性能 调参
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • ***原理与防范
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET 4.0中的泛型协变和反变
  • .NET 反射 Reflect
  • .net 流——流的类型体系简单介绍
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET导入Excel数据
  • .NET中两种OCR方式对比
  • ??eclipse的安装配置问题!??
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • [Angular 基础] - 表单:响应式表单
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务