Search a 2D Matrix
2016-08-11 10:53
253 查看
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 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.
思路
这题其实在剑指offer上也出现过,不过老师在这里讲了很多种方法所以就想记录一下。利用右上角坐标的性质,如果target < matrix[i][j] :j– 如果target < matrix[i][j]:i++,具体如下:
public boolean searchMatrix(int[][] matrix, int target) { if (matrix == null) { return false; } int m = matrix.length; if (m < 1) { return false; } int n = matrix[0].length; //注意这里n的长度可能以开始就为0; if (n < 1) { return false; } /* for (int i = 0;i < m;) { for (int j = n - 1;j >= 0 && i < m;) { if (matrix[i][j] == target) { return true; } else if (matrix[i][j] > target ) { j--; } else { i++; } } } */ for (int i = 0,j = n - 1;(j >= 0) && (i < m);) { if (matrix[i][j] == target) { return true; } else if (matrix[i][j] > target ) { j--; } else { i++; } } return false; }
这里有点疑问是我注释掉的代码其实和下面的代码是相同的复杂度,为什么在leetcode上却同不过,希望有识之士能解答。
另一个方法其实也属于是二分搜索的变种,只不过我们常见的二分搜索是一维的,这里我们利用的思想是二维的。代码如下:
public boolean find (int [][]matrix,int x1,int y1,int x2,int y2,int target) { if ((x1 > x2) || (y1 > y2)) { return false; } int midx = (x1 + x2) >> 1; int midy = (y1 + y2) >> 1; int value = matrix[midx][midy]; if (value == target) { return true; } return value > target?(find(matrix,x1,y1,x2,midy - 1,target) || find(matrix,x1,midy,midx - 1,y2,target)): (find(matrix,x1,midy + 1,x2,y2,target) || find(matrix,midx + 1,y1,x2,midy,target)); } public boolean searchMatrix(int[][] matrix, int target) { if (matrix == null) { return false; } int m = matrix.length; if (m < 1) { return false; } int n = matrix[0].length; //注意这里n的长度可能以开始就为0; if (n < 1) { return false; } return find(matrix,0,0,m - 1,n - 1,target); }
相关文章推荐
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- 本人即将筹备败家日志,敬请期待!
- 书评:《算法之美( Algorithms to Live By )》
- IE:使用搜索助手
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解