题目描述
在一个 n * m 的二维数组中,**每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。**请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路
题目的特点:“每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。”
由此,我们要先找到右上角的数K,与target相比较,如果K>target,那target肯定是在K的左边,则K的这一列就不用再看了(剔除)。同理,我们继续向前一列走,对K-1进行比较,如果K-1>target,剔除K-1所在的列,继续向前走。
如果K-2<target,那按理来说target应该是在K-2的右边或者下边,而K-2的右边已经被剔除了,所以target应该在K-2的下边找,以此类推,直到找到target。
(看到这,突然想到了运筹学里的西北角法,有点那味儿)
代码
class Solution {
public static boolean findNumberIn2DArray(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return false;
}
int rows=matrix.length;
int columns=matrix[0].length;
boolean res=findNumber(matrix,rows,columns,target);
return res;
}
private static boolean findNumber(int[][] m,int rows,int columns,int target){
boolean sign=false;
if (m!=null && rows>0 && columns>0 ){
//定义对应 行和列的指针
int row=0;
int column=columns-1;
while (row<rows && column>=0){
//k==m[row][column],比较K与target
//K==target,找到了,返回
if (m[row][column] == target){
sign=true;
break;
//K>target,去前一列找
}else if (m[row][column] > target){
column--;
}else {
//K<target,去下一行找
row++;
}
}
}
return sign;
}
}