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

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

示例 1:

输入:
matrix = [[1,   3,  5,  7],[10, 11, 16, 20],[23, 30, 34, 50]
]
target = 3
输出: true

示例 2:

输入:
matrix = [[1,   3,  5,  7],[10, 11, 16, 20],[23, 30, 34, 50]
]
target = 13
输出: false
 1 #include "_000库函数.h"
 2
 3
 4 //题目要求使用高效算法,但不知最高效的是哪个
 5 //本解法复杂度为m+n
 6 class Solution {
 7 public:
 8     bool searchMatrix(vector<vector<int>>& matrix, int target) {
 9         if (matrix.empty() || matrix[0].empty())return false;
10         int m = matrix.size();
11         int n = matrix[0].size();
12         if (target< matrix[0][0] || target>matrix[m - 1][n - 1])return false;
13         for (int i = 0; i < m; ++i)
14             if (target >= matrix[i][0] && target <= matrix[i][n - 1]) {
15                 for (int j = 0; j < n; ++j)
16                     if (target == matrix[i][j])return true;
17                 return false;
18             }
19         return false;
20     }
21 };
22
23 //当然这道题也可以使用一次二分查找法,如果我们按S型遍历该二维数组,
24 //可以得到一个有序的一维数组,那么我们只需要用一次二分查找法,
25 //而关键就在于坐标的转换,如何把二维坐标和一维坐标转换是关键点,
26 //把一个长度为n的一维数组转化为m*n的二维数组(m*n = n)后,
27 //那么原一维数组中下标为i的元素将出现在二维数组中的[i / n][i%n]的位置,
28 //
29
30 // One binary search
31 class Solution {
32 public:
33     bool searchMatrix(vector<vector<int> > &matrix, int target) {
34         if (matrix.empty() || matrix[0].empty()) return false;
35         if (target < matrix[0][0] || target > matrix.back().back()) return false;
36         int m = matrix.size(), n = matrix[0].size();
37         int left = 0, right = m * n - 1;
38         while (left <= right) {
39             int mid = (left + right) / 2;
40             if (matrix[mid / n][mid % n] == target) return true;
41             else if (matrix[mid / n][mid % n] < target) left = mid + 1;
42             else right = mid - 1;
43         }
44         return false;
45     }
46 };
47
48 void T074() {
49     Solution s;
50     vector<vector<int>>v;
51     v = { {1,3,5,7},{10,11,16,20},{23,30,34,50} };
52     cout << s.searchMatrix(v, 3) << endl;
53     cout << s.searchMatrix(v, 13) << endl;
54
55
56 }

转载于:https://www.cnblogs.com/zzw1024/p/10705619.html

力扣算法题—074搜索二维矩阵相关推荐

  1. 力扣刷题笔记--304 二维区域和检索 - 矩阵不可变 前缀和

    304 二维区域和检索 - 矩阵不可变 作者:AC_OIer 链接:https://leetcode-cn.com/problems/range-sum-query-2d-immutable/solu ...

  2. leetcode刷题 74.搜索二维矩阵

    题目分析 这是一道简单的查找二维矩阵的题目,所以解决这题有一个最简单的解法就是遍历二维数组即可:但是我们应该注意到题目中的每行整数从左到右是按升序排列的,第一个整数大于前一行的最后一个整数,介于此,我 ...

  3. 回溯法解决力扣79题单词搜索

    回溯法解决力扣79题单词搜索 给定一个 m x n 二维字符网格 board 和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则,返回 false . 单词必须按照字母 ...

  4. 程序员面试需要刷力扣算法题吗

    这里写目录标题 1. 程序员面试需要刷力扣算法题吗 1.1. 算法题的一些特征 1.2. 为什么要考查算法 1.3. 目前面试主要考查 3 类 1. 程序员面试需要刷力扣算法题吗 1.1. 算法题的一 ...

  5. LeetCode 240. 搜索二维矩阵 II(二分查找 分治)

    文章目录 1. 题目 2. 解题 2.1 从左下角或者右上角开始搜索 2.2 分治算法 1. 题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以 ...

  6. LeetCode 07: T48. 旋转图像 (中等); T54. 螺旋矩阵(中等); T240. 搜索二维矩阵 II (中等)

    文章目录 T19: 48. 旋转图像 (中等) 思路 解法 1: 新增数组 解法 2: 原地旋转 T20: 54. 螺旋矩阵(中等) 思路 解法: 到边界换方向 T21: 240. 搜索二维矩阵 II ...

  7. python 搜索二维矩阵

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

  8. LeetCode Algorithm 240. 搜索二维矩阵 II

    240. 搜索二维矩阵 II Ideas 这题我记得在左神算法初级班里面有. 主要的思想就是定义两个指针row_index和col_index,从右上角开始逐个搜索. 如果matrix[row_ind ...

  9. LintCode 28. 搜索二维矩阵

    import org.junit.Test;import java.util.Arrays;public class SearchMatrix {/*** @param matrix: matrix, ...

最新文章

  1. 【力扣网练习题】实现 strStr()
  2. 三星笔记本桌面计算机图标消失,重启电脑我的电脑图标不见了怎么处理
  3. 页面如何自动出现滚动条(overflow属性用法)
  4. 关于jsb中js与c++的相互调用
  5. puppet安装与配置
  6. HashMap的扩容机制---resize()
  7. 社会学专业喜欢计算机怎么办,考研困惑我是计算机专业的学生可是我喜欢文学想考河北师范大学的研究 爱问知识人...
  8. 原作者出局,Faker.js已被社区控制
  9. python程序运行时间计算公式_Python执行时间的计算方法小结
  10. php 顺序结构,顺序存储结构php实现
  11. 损失函数的“噪音免疫力”
  12. 问题1:编译内核出现错误‘debian/stamp/build/kernel‘及解决方案
  13. 利用canvas打造一个炫酷的粒子背景
  14. java接收端怎么收不到_java后端为什么接受不到前端发送的数据
  15. 2022年山东省安全员C证考试资料及山东省安全员C证考试试题
  16. java模拟简单的qq聊天_初学java之模拟QQ聊天软件(简单实现)
  17. 动态jenkins slave
  18. 使用js 计算两个日期之间的相差的天数
  19. STP 问题处理方法
  20. 小米手机刷入Magisk和LSPosed方法步骤

热门文章

  1. c++ winpcap开发(6)
  2. linux安装selenium、chromedriver、Chrome浏览器、BrowserMob Proxy(代理)爬虫爬站环境安装及测试实例
  3. 属性文法和语法制导翻译
  4. matlab画横的/水平的条形图
  5. webServlet(/) 和 webServlet(/*) 的区别
  6. Graph_Master(连通分量_Poj_1904)
  7. 一叶障目:排查问题的思路
  8. linux,下载与安装
  9. MySqlDataReader在Using中使用
  10. hibernate 简单笔记(一)