1. 题目
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7972a70779e1be202bd463c8bfe63fcb.png#pic_center)
2. 思路
(1) 二分查找
- 从上往下,对每一行进行二分查找,若某一行的第一个元素大于target,则表示之后不可能存在该元素,返回false即可。
(2) 线性查找
- 观察数组可以发现,如果从右上角开始查找,则当元素等于target时,直接返回true即可;当元素大于target时,该元素所在列可以直接排除;当元素小于target时,该元素所在行可以直接排除。
3. 代码
public class Test {
public static void main(String[] args) {
}
}
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
int n = matrix.length;
if (n == 0) {
return false;
}
int m = matrix[0].length;
if (m == 0) {
return false;
}
for (int i = 0; i < n; i++) {
if (matrix[i][0] == target) {
return true;
} else if (matrix[i][0] < target) {
if (binarySearch(matrix[i], 0, m - 1, target)) {
return true;
}
} else {
return false;
}
}
return false;
}
private boolean binarySearch(int[] arr, int left, int right, int target) {
while (left <= right) {
int mid = left + ((right - left) >>> 1);
if (arr[mid] == target) {
return true;
} else if (arr[mid] > target) {
return binarySearch(arr, left, mid - 1, target);
} else {
return binarySearch(arr, mid + 1, right, target);
}
}
return false;
}
}
class Solution1 {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return false;
}
int rowIndex = 0;
int colIndex = matrix[0].length - 1;
while (rowIndex < matrix.length && colIndex >= 0) {
if (matrix[rowIndex][colIndex] == target) {
return true;
} else if (matrix[rowIndex][colIndex] > target) {
colIndex--;
} else {
rowIndex++;
}
}
return false;
}
}