Solution
思路1:
暴力搜索
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
for (int[] row: matrix) {
for (int x : row) {
if (x == target)
return true;
}
}
return false;
}
}
思路2:
每行有序,可以二分查找
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
for (int[] row: matrix) {
if (searchVal(row, target)) return true;
}
return false;
}
public boolean searchVal(int[] row, int target) {
int l = 0, r = row.length - 1;
while (l <= r) {
int mid = (r - l) / 2 + l;
if (row[mid] == target) return true;
if (row[mid] < target) l = l + 1;
else r = r - 1;
}
return false;
}
}
思路3:
根据矩阵特性,从右上角往左下角搜索,右上角((x,y))与(target)对比,
- 如果((x,y)>target),因为每一列从上往下递增,所以该列没必要往下 ,则y--
- 如果((x,y)<target),因为每一行从左到右递增,所以该行没必要往左 ,则x++
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int n = matrix.length, m = matrix[0].length;
int x = 0, y = m - 1;
while (x < n && y > -1) {
if (matrix[x][y] == target) return true;
if (matrix[x][y] > target) y -= 1;
else x += 1;
}
return false;
}
}
// (0, m-1) (n, 0)