1.问题描述

  写一个高效的算法,从一个 m×n m\times n的整数矩阵中查找出给定的值,矩阵具有如下特点:
  

  • 每一行从左到右递增。

  • 每一列从上到下递增。


2. 方法与思路

2.1 二分查找法

  根据矩阵的特征很容易想到二分法,但是这是一个二维的矩阵,如何将问题转化为一维是关键。实际上我们可以根据矩阵的第一列确定值可能所在的行的范围 (limu,limd) (limu,limd),其中limu=0,使得 matrix[0][0]≤matrix[i][0]≤matrix[limd][0] matrix[0][0] \le matrix[i][0] \le matrix[limd][0], i∈[0,limd] i \in [0,limd]。而确定limd的值可以使用二分法。
  确定了值可能在的行的范围后,逐行在进行二分查找目标值,这样就将问题降到一维上来了。代码如下:
  

class Solution {
public:bool searchMatrix(vector<vector<int> >& matrix, int target) {if(matrix.size() == 0) return false;int i,j,mid,rows = matrix.size(),cols = matrix[0].size();int limd = rows-1,limu = 0;/*二分查找目标值可能所在行的下限*/while(limu < limd){mid = (limu + limd)/2;if(matrix[mid][0] > target) limd = mid - 1;else if(matrix[mid][0] < target) limu = mid +1;else return true;}/*对每一行进行二分查找*/for(i = 0; i <= limd; i++){int l = 0, r = cols-1;while(l <= r){mid = (l + r)/2;    if(matrix[i][mid] < target) l = mid+1;else if(matrix[i][mid] > target) r = mid - 1;else return true;}}return false;}
};

2.2 分治法

  还有一种方法就是采用分值的思想。以题目给出矩阵为例,查找数字5。仔细观察矩阵,最右上角的数字为15,由于矩阵是列递增,所以数字5不可能在最右侧15这一列,我们便可将这一列不予考虑,将范围缩减了一列。
  
             [1,   4,   7,  11]
             [2,   5,   8,  12]
             [3,   6,   9,  16]
             [10,  13,  14,  17]
             [18,  21,  23,  26]

  再判断数字11,同样 11>5 11 > 5,又缩减一列。数字7同样小于5,在缩减一列,那么现在的矩阵变为:
              [1,   4,]
             [2,   5]
             [3,   6]
             [10,  13]
             [18,  21]
  判断数字4时,由于 5>4 5 > 4,目标值肯定不在4所在的行,去点这一行,在进行判断。
             [2,   5]
             [3,   6]
             [10,  13]
             [18,  21]
 Okay,判断数字5,找到目标值返回。
 
 这种算法时间复杂度 O(n) O(n),要优于第一种算法,代买如下:
 

class Solution {
public:bool searchMatrix(vector<vector<int> >& matrix, int target) {if(matrix.size() == 0) return false;int i,j,rows = matrix.size(),cols = matrix[0].size();i = 0; j = cols-1; while(i < rows && j >= 0){if(matrix[i][j] == target) return true;else if(matrix[i][j] > target) j--;else i++;}return false;       }
};

Leetcode 240 Search a 2D Matrix II (二分法和分治法解决有序二维数组查找)相关推荐

  1. LeetCode 240. Search a 2D Matrix II

    LeetCode 240. Search a 2D Matrix II Solution1: 为什么把第74题的代码改都不用改的拿过来就可以AC,一脸懵逼啊... class Solution { p ...

  2. [Leetcode] 240. Search a 2D Matrix II 解题报告

    题目: Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the f ...

  3. leetcode 240. Search a 2D Matrix II | 240. 搜索二维矩阵 II(Java)

    题目 https://leetcode.com/problems/search-a-2d-matrix-ii/ 题解 方法1 思路类似于 leetcode 200. Number of Islands ...

  4. LeetCode 74. Search a 2D Matrix

    LeetCode 74. Search a 2D Matrix Solution1:我的答案 <剑指offer>原题 class Solution { public:bool search ...

  5. 二分法和分治法概念区别--记录

    1.二分法和分治法的概念区别: 二分搜索每次都要舍弃一半,从留下的一半中寻找目标:而分治法把一个大问题分成两个或多个小问题,递归地求这些小问题的解,最后再把它们小心谨慎的合并起来,并且要仔细考虑合并时 ...

  6. LeetCode Search a 2D Matrix II

    问题:给出一个二维数组,其行,列是递增的,和一个要查找的数,问矩阵中是否有要查找的数 思路: 第一种方法是直接暴力查找,在二维数组中查找. 第二种方法是基于对角线上,在行,列上作二分查找 第三种方法递 ...

  7. LeetCode-240 Search a 2D Matrix II

    题目描述 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the ...

  8. [Leetcode] 74. Search a 2D Matrix 解题报告

    题目: Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the f ...

  9. 二维数组查找(C++)(二分查找)

    题目描述 已知int一个有序矩阵mat,同时给定矩阵的大小n和m以及需要查找的元素x,且矩阵的行和列都是从小到大有序的.设计查找算法返回所查找元素的二元数组,代表该元素的行号和列号(均从零开始).保证 ...

最新文章

  1. 计算机科学领域最高荣誉,骄傲!这位毕业于嘉兴一中的数学家,荣获华人数学领域的最高荣誉...
  2. checkbox的全选中,取消全选中
  3. Codeforces 1103
  4. C++/CLI Winform中调用DLL的三种方法
  5. c++异常的层次结构(继承在异常中的应用)
  6. 为什么Internet选择分组交换而不是电路交换_交换机和路由器的区别有哪些?
  7. 浅谈StringBuilder
  8. 什么是 Unix 以及它为什么这么重要?
  9. 深入理解Java String 池概念(String pool concept)
  10. 在visual studio2015中使用easyX画图
  11. BGP联邦原理及配置实例
  12. 构建之法 前三章读后感
  13. Mysql分页查询出现重复数据
  14. 西部数码网站备案幕布及核验单填写规范
  15. Medusa 破解centos密码
  16. OSChina 周二乱弹 ——有一天你当了程序员巴巴
  17. 集合长度可变的实现原理(解析为什么集合长度可变)
  18. 视觉SLAM(二):相机与图像
  19. 使用Cydia能干什么
  20. 动态代理:1 个经纪人如何代理 N 个明星

热门文章

  1. 冯炜权与他的万事达卡
  2. 分享7款颜色的CSS表格样式美化网页表格用户体验
  3. 有时候突然发觉自己太无知
  4. C++Python描述 LeetCode 551. 学生出勤记录 I
  5. android bsp入门到精通,利用BSP博客优化独立博客
  6. 相亲、相亲,广大年轻人的噩梦,那么我们就来采集一下相亲网站数据叭~
  7. 畸形婚姻的尴尬与无奈
  8. 如何设置圆角的EditText——Android移动开发
  9. 将音乐文件设置为来电铃声,短信铃声以及联系人铃声
  10. 如何利用营销来更好传播信息