题目:

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。

示例 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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/search-a-2d-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

【两次二分】

根据题目意思,每一行从上到下是升序的,每一列从上到下都是升序的,这样的话就可以运用两次二分查找,先找到合适的行,再找到合适的列。

  • 第一次二分:从第0列中的所有行开始找,先聚焦target在哪个具体的行row;
  • 第二次二分:在找到行的基础上,去找到合适的列col,从而就能确定出target是否在二维矩阵中。

java代码:

 1 class Solution {
2 public boolean searchMatrix(int[][] matrix, int target) {
4 int m = matrix.length, n = matrix[0].length;
5 //第一次二分先找到行号
6 int left = 0, right = m - 1;
7 while (left < right){
8 int mid = left + (right - left + 1) / 2;
9 if (target >= matrix[mid][0]){
10 left = mid;
11 }else{
12 right = mid - 1;
13 }
14 }
15 //循环结束时:left > right
16 int row = right;
17 if (matrix[row][0] > target) return false;
18 //第二次二分找到列
19 left = 0; right = n - 1;
20 while (left < right){
21 int mid = left + (right - left) / 2;
22 if (target == matrix[row][mid]) return true;
23 if (target > matrix[row][mid]){
24 left = mid + 1;
25 }else {
26 right = mid;
27 }
28 }
29 int col = right;
30 return matrix[row][col] == target;
31 }
32 }

 python3代码:

 1 class Solution:
2 def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
3 m, n = len(matrix), len(matrix[0])
4 left, right = 0, m - 1
5 while left <= right:
6 mid = left + (right - left) // 2
7 if target > matrix[mid][0]:
8 left = mid + 1
9 elif target < matrix[mid][0]:
10 right = mid - 1
11 else:
12 return True
13 row = right
14 left, right = 0, n-1
15 while left <= right:
16 mid = left + (right - left) // 2
17 if target > matrix[row][mid]:
18 left = mid + 1
19 elif target < matrix[row][mid]:
20 right = mid - 1
21 else:
22 return True
23 return False

 【直接遍历】

遍历查找每个位置,看target是否出现。

 java代码:

 1 class Solution {
2 public boolean searchMatrix(int[][] matrix, int target) {
3 int m = matrix.length, n = matrix[0].length;
4 for (int i = 0; i < m; i++){
5 for (int j = 0; j < n; j++){
6 if (matrix[i][j] == target){
7 return true;
8 }
9 }
10 }
11 return false;
12 }
13 }

 python代码:

1 class Solution:
2 def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
3 m, n = len(matrix), len(matrix[0])
4 for i in range(m):
5 for j in range(n):
6 if matrix[i][j] == target:
7 return True
8 return False

力扣74(java&python)-搜索二维矩阵(中等)的更多相关文章

  1. LeetCode(74):搜索二维矩阵

    Medium! 题目描述: 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例  ...

  2. Java实现 LeetCode 74 搜索二维矩阵

    74. 搜索二维矩阵 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: ...

  3. LeetCode:搜索二维矩阵【74】

    LeetCode:搜索二维矩阵[74] 题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的 ...

  4. LeetCode 74. 搜索二维矩阵(Search a 2D Matrix)

    74. 搜索二维矩阵 74. Search a 2D Matrix 题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. ...

  5. 【leetcode】74. 搜索二维矩阵

    题目链接:传送门 题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例  ...

  6. Java实现 LeetCode 240 搜索二维矩阵 II(二)

    240. 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. ...

  7. lintcode:搜索二维矩阵II

    题目 搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没 ...

  8. lintcode :搜索二维矩阵

    题目: 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1 ...

  9. LeetCode 240. 搜索二维矩阵 II(Search a 2D Matrix II) 37

    240. 搜索二维矩阵 II 240. Search a 2D Matrix II 题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性 ...

  10. LeetCode74.搜索二维矩阵

    74.搜索二维矩阵 描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 示 ...

随机推荐

  1. DuiLib 一个window的皮肤库 C++ 项目,打包小,比较纯正主流的大制作

    https://github.com/duilib/duilib 从 火柴 那个软件 发现的这个库

  2. function 的入参 如果是指针的话,如果你用的好的话,会颠覆三观啊 这里就是指对象,数组不用考虑 // 夏娃的苹果

    function 的入参 如果是指针的话,如果你用的好的话,会颠覆三观啊 这里就是指对象,数组不用考虑 这就是一颗 夏娃的苹果

  3. day26--Java集合09

    Java集合09 18.TreeSet 元素无序:插入顺序和输出顺序不一致 可以按照一定的规则进行排序,具体排序方式取决于构造方法: TreeSet () :根据其元素的自然排序进行排序 TreeSe ...

  4. .Net Core 你必须知道的source-generators

    源生成器是 C# 9 中引入的一项功能,允许在编译过程中动态生成代码. 它们直接与 C# 编译器集成(Roslyn)并在编译时运行,分析源代码并根据分析结果生成附加代码. 源生成器提供了一种简化的自动 ...

  5. Djaong 运行报错:ValueError: Unable to configure handler 'default'

    一.前提条件 1.Django 项目接入了 log 日志模块 二.解决方案 启动项目或者项目运行中,遇到如下报错 File "C:\Python38\lib\logging\config.p ...

  6. 工作记录:TypeScript从入门到项目实战(进阶篇)

    内置对象的使用 JavaScript中有许多内置对象,可以直接在JavaScript程序中使用,同样的,TypeScript也延续了这些内置对象 全局的对象( global objects )或称标准 ...

  7. 记录--实时音视频功能简析(live-pusher与live-player)

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 使用须知 2017年下半年,微信6.5.21版本支持在线音视频功能.开发者可以通过两个音视频组件 和 实现实时地在线直播.视频通话.语音通 ...

  8. TCL之基本语法1

    TCL之基本语法1 1:set  and puts set就是变量声明,这个声明在需要使用的指令下会自动执行,不会出现没有声明的错误.但是对于puts这类定向访问的是不能没有声明的.这里简单理解TCL ...

  9. KingbaseES V8R6 等待事件之CLogControlLock

    前言 Kingbase数据库的tuple行头部来标识这条记录的事务结束状态(未知.已提交.已回滚),在事务提交时如果并发更新100万行记录,需要对多个page的tuple进行更改,这种繁重的操作会对数 ...

  10. HTTP编码和解码与基本认证

    咱们在计算机屏幕上看到的是实体化的文字,而在计算机存储介质中存放的实际是二进制的比特流.那么在这二者之间的转换规则就须要一个统一的标准,不然把计算机上文档就乱码了:因而为了实现转换标准,各类字符集标准 ...