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

力扣 74.搜索二维矩阵

题目描述

给你一个满足下述两条属性的 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

题解1:

两次二分,首先查找行,找到第一列的某一行的首元素是小于等于target的最大值,如果能找到这么一行,就说明target就在该首元素所在行,因为相邻的两行之间是首尾相接之后,按照大小排列的,因此如果找到一行的首元素是小于等于target的最大值,那么这一行之前的元素一定都比target小,这一行之后的元素都会大于target,因为该行首元素都小于等于target了,该行的上一行更会小于target了,而且每一行的尾元素大于下一行的首元素,不可能出现相等的情况。

实现代码:

  public static boolean searchMatrix(int[][] matrix, int target) {int rowIndex = BinarySearchFirstColum(matrix,target);if(rowIndex==-1){return false;//这里是说全部行的首元素都大于target,即找不到一个最大的小于等于target的行首元素}return BinarySearchFirstRow(matrix[rowIndex],target);//单对这一行进行二分查找target}public static int BinarySearchFirstColum(int[][] arr, int target){int low = -1;int high = arr.length-1;while(low<high){int mid = (high-low+1)/2+low;if(arr[mid][0] <= target){low = mid;}else{high = mid-1;}}return low;}public static boolean BinarySearchFirstRow(int[] arr, int target) {int low = 0;int high = arr.length-1;while(low<=high){int mid = (high-low)/2+low;if(arr[mid] == target){return true;}else if(arr[mid]>target){high = mid-1;}else{low = mid+1;}}return false;}

知识点:

1、二分查找的套路,如果low初始值设为-1,那么while循环的判断条件就是low<high,并且mid的计算是(high-low+1)/2+low;

如果low的初始值设为0,那么while循环的判断条件就是low<=high,计算mid的公式是:(high-low)/2+low

题解2:

考虑只使用一次二分查找,思路就是将数组相邻两行首尾相接,抽象成一个一维数组,但是计算的时候需要通过 

 int x = matrix[mid / n][mid % n];

来映射到实际的二维数组上。

实现代码

class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length, n = matrix[0].length;int low = 0, high = m * n - 1;while (low <= high) {int mid = (high - low) / 2 + low;int x = matrix[mid / n][mid % n];if (x < target) {low = mid + 1;} else if (x > target) {high = mid - 1;} else {return true;}}return false;}
}

 

相关文章:

  • vue 将图片url转base64
  • 优化财务管理制度提升企业经营效益—以审计代理记账为例
  • JWT及单点登录实现
  • window.setInterval(func,interval)定时器
  • Java | Leetcode Java题解之第137题只出现一次的数字II
  • 高质量 HarmonyOS 权限管控流程
  • 尝试使用blazor(二)Blazor WebAssembly(WASM)与Server之间有什么区别?
  • Python | 洗盘子(栈)
  • 获得抖音商品评论 API 返回值
  • 一个例子了解c++的指针数组和数组指针
  • Linux网络编程——概念及实现双方聊天
  • mingw64,clang,gcc
  • C# Maui 报错:程序“[15748] MauiApp1.exe”已退出,返回值为 2147942405 (0x80070005)
  • 简说SQLServer
  • cocos入门6:向量简介
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • es6--symbol
  • ES6简单总结(搭配简单的讲解和小案例)
  • js面向对象
  • Laravel 菜鸟晋级之路
  • MD5加密原理解析及OC版原理实现
  • node 版本过低
  • storm drpc实例
  • 编写符合Python风格的对象
  • 对象引论
  • 容器服务kubernetes弹性伸缩高级用法
  • 原生Ajax
  • 积累各种好的链接
  • 我们雇佣了一只大猴子...
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​zookeeper集群配置与启动
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • (1)无线电失控保护(二)
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (52)只出现一次的数字III
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (PySpark)RDD实验实战——取一个数组的中间值
  • (vue)页面文件上传获取:action地址
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • **CI中自动类加载的用法总结
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Framework 4.6.2改进了WPF和安全性
  • .Net 应用中使用dot trace进行性能诊断
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • [1181]linux两台服务器之间传输文件和文件夹
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [Bugku]密码???[writeup]