题目

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

  • Integers in each row are sorted from left to right.
  • The first integer of each row is greater than the last integer of the previous row.

For example,

Consider the following matrix:

[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]

Given target = 3, return true.

题解:

虽然本题看似是矩阵问题,但是本着搜索题目关键字为第一步的原则,可以找到:each row are sorted,每一行按照顺序也是sorted。同时也是数组保存。

但是本题的难点就是如何将2D矩阵转换成1D,然后利用二分查找法来解决问题。转换的重点就在于每个点的位置,在矩阵表示中,我们习惯用(i,j)来表示一个点,所以这就有碍于我们使用low high mid来指向需要的位置。为了解决问题,第一步就是需要将这个矩阵按照顺序拉成一条线。

像题中的例子我可以将其转化为:

position: 0   1   2   3   4   5   6   7   8   9   10   11

values:   1   3   5   7   10 11 16 20  23 30  34  50

row:       0   0   0   0   1   1   1   1   2   2    2    2

column:        3   0         0      2    3

其中:行数rows=3,列数columns=4

如上,这个就是将2D矩阵转化成1行数组的对应表。所以对于二分查找法的初始值为:low=0,high=rows*columns-1(总共数值的个数,因为从0开始所以减1)。而为了能够方便在given 2D matrix找到需要比对的值,我们还是需要确定行数和列数,通过上表可以看出,行数是position/columns,而列数是position%columns, 这样一来,就能很容易的在原矩阵中定位到所需要的值。剩下其他的解题思路,就与二分查找法一模一样了。

时间复杂度O(log(rows*columns))

代码如下:

 1     public boolean searchMatrix(int[][] matrix, int target) {
 2         if(matrix.length==0||matrix[0].length==0||matrix==null)
 3             return false;
 4             
 5         int rows = matrix.length;
 6         int cols = matrix[0].length;
 7         
 8         int low = 0;
 9         int high = rows*cols-1;
         
         while(low<=high){
             int mid = (low+high)/2;
             int midValue = matrix[mid/cols][mid%cols];
             if(midValue == target)
                 return true;
             else if(midValue < target)
                 low = mid+1;
             else
                 high = mid-1;
         }
         return false;
     }

同时,也有另外一个解决该题的方法,就是利用两次二分查找法。因为所给矩阵第一列也是升序排列的,所以可以先对第一列进行二分查找,锁定该元素所在行数,然后再对列进行二分查找,即可判断target是否存在。这个的算法时间复杂度是O(log(rows)+log(columns))。

代码如下:

 1     public boolean searchMatrix(int[][] matrix, int target) {  
 2         if(matrix == null || matrix.length==0 || matrix[0].length==0)  
 3             return false;  
 4         int low = 0;  
 5         int high = matrix.length-1;  
 6         while(low<=high){  
 7             int mid = (low+high)/2;  
 8             if(matrix[mid][0] == target)
 9                 return true;  
             else if(matrix[mid][0] > target)  
                 high = mid-1; 
             else
                 low = mid+1;  
         }
         
         int row = high; //当从while中跳出时,low指向的值肯定比target大,而high指向的值肯定比target小
         
         if(row<0)  
             return false; 
             
         low = 0;  
         high = matrix[0].length-1;  
         while(low<=high){  
             int mid = (low+high)/2;  
             if(matrix[row][mid] == target)
                 return true;  
             else if(matrix[row][mid] > target)  
                 high = mid-1;
             else 
                 low = mid+1;  
         }     
         return false;  
     } 

Reference:

http://www.programcreek.com/2013/01/leetcode-search-a-2d-matrix-java/

http://blog.csdn.net/linhuanmars/article/details/24216235

Search a 2D Matrix leetcode java的更多相关文章

  1. Search a 2D Matrix ——LeetCode

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  2. Search a 2D Matrix leetcode

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  3. LeetCode Search a 2D Matrix II

    原题链接在这里:https://leetcode.com/problems/search-a-2d-matrix-ii/ Write an efficient algorithm that searc ...

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

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

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

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

  6. [LeetCode] Search a 2D Matrix II 搜索一个二维矩阵之二

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  7. [LeetCode] Search a 2D Matrix 搜索一个二维矩阵

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  8. [LeetCode] 74 Search a 2D Matrix(二分查找)

    二分查找 1.二分查找的时间复杂度分析: 二分查找每次排除掉一半不合适的值,所以对于n个元素的情况来说: 一次二分剩下:n/2 两次:n/4 m次:n/(2^m) 最坏情况是排除到最后一个值之后得到结 ...

  9. LeetCode: Search a 2D Matrix 解题报告

    Search a 2D Matrix Write an efficient algorithm that searches for a value in an m x n matrix. This m ...

随机推荐

  1. POJ - 2456 Aggressive cows 二分 最大化最小值

    Aggressive cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18099   Accepted: 8619 ...

  2. 不改源代码,修改服务器配置,解决全局Get中文乱码问题

  3. myeclipse 插件下载方式

    myeclipse10,大家都知道,MyEclipse 中有一个烦人的 Software and Workspace center,这东西,加载特别慢,我用10版本基本是没有可能看到这个界面.更别说在 ...

  4. 常见的Javascript报错及解决方案

    一.堆栈溢出不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,以至于覆盖了别的数据.1.哪些操作会引起堆栈溢出?比如递归2.如何解决堆栈溢出?闭包,setTimeout,优化调 ...

  5. 1015 Reversible Primes (20)(20 point(s))

    problem A reversible prime in any number system is a prime whose "reverse" in that number ...

  6. PreEssentials与MFC集成使用

    ProEssentials是Gigasoft公司开发的一个功能十分强大的分发免费的工控图表.它提供了几乎所有的曲线显示形式,支持多种开发工具,提供以下接口供开发者调用:.NET(WinForm).AS ...

  7. BZOJ.5407.girls(容斥 三元环)

    题目链接 CF 原题 \(Description\) 有n个点,其中有m条边连接两个点.每一个没有连边的三元组\((i,j,k)(i<j<k)\)对答案的贡献为\(A*i+B*j+C*k\ ...

  8. bzoj 4033

    树形DP,dp[i][j]表示i子树中,选了j个白点,i子树中所有边的贡献. /************************************************************ ...

  9. Vue+Express实现前后端分离

    先说明一下缘由,因为自己前段时间在实习,实习期间为了参与项目开发,粗略学习了下Vue.Vuex.Vue-Router,大致会一些基础的.这里也快要做毕业设计了,趁着放假回来的这两天,学习下Node的相 ...

  10. hdoj 4272 LianLianKan 数据太水

    LianLianKan Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...