本例源码下载地址:SearchMatrix
题目描述:
题目大意是给编写一个高效率的算法来查找一个mxn的二维矩阵数组里面是否存在一个目标数。
该矩阵的有2个特点:
1、每行的元素从左到右升序排列
2、每列的元素从上到下升序排列
思路:
1、题目中没有说明该数组是不是空的,因此需要对空数组判断。
2、简单的遍历二维数组可以找到,算法复杂度为O(mxn),但是并不高效。
3、从数组特性来看,每行及每列升序排列,则在行中,如果最大的数(以题目中0行最大数15为列)都已经大于目标数,由于该行最大的数在其列中是最小的,因此该行所在的列中所有的数都不符合要求。
同理,如果该行最大的数小于目标数,由于该行最大的数是该行最大的,因此该行所在行中的所有数都不符合要求。
我们来验证演算一下:
从上面的演算过程可以看到,通过该方法只需要4步就可以找到对应的数。对比数组遍历复杂度小了很多。
解决方案:
取数组行数row和列数col,从右上角开始(0行,col列)的数开始比较,如果该数与目标数相等,则为目标数,如果比目标数大,则忽略查找该数所在的列,如果该数比目标数小,则忽略查找该数所在的行。
相应的代码:
public static boolean searchMatrix(int[][] matrix, int target){
if (matrix.length == 0) return false;
int row = 0;
int col = matrix[0].length - 1;
int temp;
boolean result = false;
while(row < matrix.length && col >= 0){
temp = matrix[row][col];
System.out.println("search temp is "+temp);
if (temp == target){
result = true;
System.out.println("search success index is ("+row+","+col+")");
break;
}else{
if (temp > target){
col--;
}else{
row++;
}
}
}
return result;
}