题目描述
题目分析
这道题从题意可以很轻松就能看出,它是一个严格的排序数组,每一行是顺序的,每一列也是顺序的,知道这一点做这道题就很简单了。我采用的方法是:① 把每一行的第一个数字赋值到一个一维数组上,方便判断我们的目标数字在哪一行上;② 确定好行数后,再将该行的一行数字赋值到另一个一维数组上,在该一维数组上调用Java的进行二分查找的方法,用来判断是否有目标数。
在这两个步骤中都有需要注意的点,步骤一中需要注意如何确定好行的位置,步骤二中需要注意调用库的二分查找方法,当没有查找成功时,该方法返回的是什么(是(-(插入点) - 1)),根据这个返回的数字进行判断是否在该数组中。
代码实现
package LeeCode;
import java.util.Arrays;
public class SearchMatrix74 {
public static void main(String[] args) {
int[][] matrix = {
{1, 3, 5, 7},
{10, 11, 16, 20},
{23, 30, 34, 50}
};
System.out.println(searchMatrix(matrix,12));
}
public static boolean searchMatrix(int[][] matrix, int target) {
if (matrix.length==0)
return false;
if (matrix[0].length==0)
return false;
int[] rows = new int[matrix.length]; //用来复制每一行的第一个数字
int rownum = 0; //用来记录key会出现在哪一行
for (int i = 0; i < rows.length; i++) {
rows[i] = matrix[i][0];
}
for (int i = 0; i < rows.length; i++) {
if (rows[i]>target&&i>0&&i<rows.length){
rownum = i-1; //这时候target只有可能出现在i-1行
break;
}
if (i==rows.length-1){
rownum =rows.length-1;
break;
}
}
int[] lines = new int[matrix[0].length]; //用来复制可能会出现在的那一行的所有数字
for (int i = 0; i < lines.length; i++) {
lines[i] = matrix[rownum][i];
}
if (Arrays.binarySearch(lines,target)>=0) //二分查找时,若无结果,则返回值会小于0
return true;
return false;
}
}