题目:

编写一个高效的算法来判断 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. idea 暂存 Stash Changes Git/Repository/Stash Changes 恢复暂存 UnStash Changes

    idea 暂存 Stash Changes Git/Repository/Stash Changes 恢复暂存 UnStash Changes git stash save "save me ...

  2. [好文推荐] vue3 源码分析 mini-vue 写的不错

    [阮一峰推荐]学习 vue3 源码的利器 git clone https://github.com/cuixiaorui/mini-vue.git

  3. Electron Mac 打包报 Error: Exit code: ENOENT. spawn /usr/bin/python ENOENT 解决方法

    Electron 项目使用vue-cli-electron-builder创建,原来我的 Mac 上编译都很正常 自从 Mac 升级到 mac OS ventura version 13.0.1 后打 ...

  4. JSF+EJB+JPA之整体思想

    序言: JSF+EJB+JPA 其实没有想象中的难,不过要做好应用以及在合适的地方建立应用,才是真正的难点. 好的技术在不合适的地方做了应用,那也只能是垃圾. 所以这个东西并不适合于太小规模的企业应用 ...

  5. vscode远程登陆免密码

    A,B双方通信,A想向B发送信息,又不想让别人知道,使用非对称加密:若A向B发送信息,A需要知道B的公钥简称B-pub,用B-pub加密信息后 发送给B,B再用自己的私钥B-prv解密出信息. A想验 ...

  6. C++容器、类型转换、异常与文件流操作

    C++容器.类型转换.异常与文件流操作 目录 C++容器.类型转换.异常与文件流操作 容器 序列式容器/顺序容器 向量(vector) 列表 (list) 双端队列(deque) 栈(stack) 队 ...

  7. 01.Android线程池实践基础

    目录介绍 01.实际开发问题 02.线程池的优势 03.ThreadPoolExecutor参数 04.ThreadPoolExecutor使用 05.线程池执行流程 06.四种线程池类 07.exe ...

  8. 三维模型OBJ格式轻量化的跨平台兼容性问题分析

    三维模型OBJ格式轻量化的跨平台兼容性问题分析 三维模型的OBJ格式轻量化在跨平台兼容性方面具有重要意义,可以确保模型在不同平台和设备上的正确加载和渲染.本文将分析OBJ格式轻量化的跨平台兼容性技术, ...

  9. 你是怎么理解ES6中 Decorator 的?使用场景?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.介绍 Decorator,即装饰器,从名字上很容易让我们联想到装饰者模式 简单来讲,装饰者模式就是一种在不改变原类和使用继承的情况下, ...

  10. 基于UDP的服务器端/客户端

    基于UDP的数据I/O函数 //成功时返回传入的字节数,失败时返回-1 ssize_t sendto (int __fd, const void *__buf, size_t __n, int __f ...