题目
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路分析
- 必须找到一个角,该角两边数字大小分别是递增和递减,这样可以用来排除错误选项。
- 对于该题目来说,右上角和左下角是可以入手的点,以此点为起点,开始进行删除行或列,直至找到该点。
特殊情况
- 查找数字大于该二维数组。
- 查找数字小于该二维数组。
- 查找数字大小合适,但不存在该二维数组中。
代码实现
在实现思路的前提下,要满足特殊情况,才是一个良好的算法。
public boolean findA(int[][] test,int a){
if(test==null)
return false;
//获取行列宽
int lieMax=test.length-1;
int hangMax=test[0].length-1;
//获取数组最大最小数字
int maxNum=test[hangMax][lieMax];
int minNum=test[0][0];
if(a>maxNum||a<minNum)
return false;
int currentHang=0;
int currentLie=lieMax;
//判断退出条件
while(currentHang<=hangMax&¤tLie>=0){
int current=test[currentHang][currentLie];
//如果当前数字大于要找的数字,则删除当前列
if(current>a){
currentLie--;
}else if(current<a){
currentHang++;
}else{
return true;
}
}
return false;
}