题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路
该二维数组是按照每行从左往右自增、每列从上到下递增的顺序排列的。
所以可以考虑先从第一行开始遍历每一行的第一个元素,并不断与target进行比较,停在不小于target的那一行,记为i;
从第i-1行开始,行数递减地遍历每一行小于target的每个元素。
在遍历过程中,如果遇到与target相同的元素,直接结束查找,返回true。
题解
public class Solution {
public boolean Find(int target, int [][] array) {
if(array==null)
return false;
int i=0,j=0,k=0;
int m=array.length,n=array[0].length;
if(m<=0||n<=0)
return false;
for(;i<m&&array[i][0]<target;i++);
if(i<m&&array[i][0]==target)
return true;
for(k=i-1;k>=0;k--){
for(j=1;j<n&&array[k][j]<target;j++);
if(j<n&&array[k][j]==target)
return true;
}
return false;
}
}
反思
在几次编译过程中都出现了数组越界的报错,但是我是增加了数组边界检查的代码。经过多次检查,才发现是&&连接的两个条件式的顺序问题。
条件式1 && 条件式2
如果1为false,则2不执行。
所以应该将边界检查放在1,判断是否相等放在2,才不会造成数组越界。
思路扩展
要尽可能缩短搜索的范围,而且尽可能是范围是一整块。
可以考虑从最右一列进行筛选,从第一行开始依次将target跟最右一列的值进行比较,如果target>最右的值,则target肯定不在这一行的范围内,行数递增。
直到target<=最右的值,在满足该条件的行内进行筛选。