您的位置:首页 > 其它

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息