LeetCode 74 Search a 2D Matrix
2016-05-25 10:43
423 查看
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:
Given target =
思路:矩阵的每一行的最小数据也大于前一行的最大数据,就是任何数据都大于前一行的所有数据。因此可以把矩阵按行顺序展开,数据递增排序,二分查找即可。展开后,第k个位置的数据,在矩阵中的位置为:matrix[k/ n][k % n],n代表矩阵的总列数。时间复杂度为O( log(m*n) )
更简单,更快的做法,参考LeetCode 240的解法,时间复杂度为O(m+n).
public boolean searchMatrix2(int[][] matrix, int target) {
if (matrix.length == 0) return false;
int m = 0, n = matrix[0].length - 1;
while (m < matrix.length && n >= 0) {
int x = matrix[m]
;
if (target == x) return true;
else if (target < x) n--;
else m++;
}
return false;
}
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.
思路:矩阵的每一行的最小数据也大于前一行的最大数据,就是任何数据都大于前一行的所有数据。因此可以把矩阵按行顺序展开,数据递增排序,二分查找即可。展开后,第k个位置的数据,在矩阵中的位置为:matrix[k/ n][k % n],n代表矩阵的总列数。时间复杂度为O( log(m*n) )
public boolean searchMatrix(int[][] matrix, int target) { if (matrix.length == 0) return false; int m = matrix.length, n = matrix[0].length; int low = 0, hight = m * n; while (low < hight) { int mid = low + (hight - low) / 2; int vlaue = matrix[mid / n][mid % n]; if (vlaue == target) return true; else if (vlaue < target) low = mid + 1; else hight = mid; } return false; }
更简单,更快的做法,参考LeetCode 240的解法,时间复杂度为O(m+n).
public boolean searchMatrix2(int[][] matrix, int target) {
if (matrix.length == 0) return false;
int m = 0, n = matrix[0].length - 1;
while (m < matrix.length && n >= 0) {
int x = matrix[m]
;
if (target == x) return true;
else if (target < x) n--;
else m++;
}
return false;
}
相关文章推荐
- Redis中实现查找某个值的范围
- 批量文件查找替换功能的vbs脚本
- WinForm实现按名称递归查找控件的方法
- 一个用vbs查找硬盘所有分区中的指定程序的代码
- 浅析Node.js查找字符串功能
- C++二分法在数组中查找关键字的方法
- C++中字符串查找操作的两则实例分享
- WinForm自定义函数FindControl实现按名称查找控件
- Shell脚本学习指南之查找与替换介绍
- php实现指定字符串中查找子字符串的方法
- C#查找对象在ArrayList中出现位置的方法
- jquery 查找新建元素代码
- Oracle 查找与删除表中重复记录的步骤方法
- SQL Server根据分区表名查找所在的文件及文件组实现脚本
- PHP学习之字符串比较和查找
- js实现的二分查找算法实例
- python查找指定具有相同内容文件的方法
- 二叉查找树的插入,删除,查找
- php查找指定目录下指定大小文件的方法
- php查找字符串出现次数的方法