题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下的顺序排列,请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数
方法一:最开始的想法:用两个for循环来做,代码如下:
function find2(matrix,rows,columns,number){
var found2=false;
for(var i=0;i<rows;i++){
for(var j=0;j<columns;j++){
if(matrix[i][j]==number){
found2=true;
break;
}
}
}
return found2;
}
优点:仅仅能解决问题
缺点:1、最致命的就是时间复杂度为O(n²)
2、任何人都能想到的解决方法。
方法二:结合题目给的条件,这里题目给了条件,就是为了能使用时间复杂度较低的算法来解决,这里就实际情况来想,一个数小于左上角的数,那这个数一定不再数组中,如果大于两个方向都可以有,不能排除数字。一个数如果大于右上角的数,那接下来只能在除了第一行之外去寻找,如果小于右上角的数,那这个数就只能在排除最后一列去寻找。所以这样减少了比较的数字。同样左下角也可以当做寻找的起点。按这种思路写的代码如下:
function find(matrix,rows,columns,number){
var found=false;
if(matrix!=null&&rows>0&&columns>0){
var row=0;
var column=columns-1;//从右上角开始寻找
while(row<rows&&column>=0){
if(matrix[row][column]==number){
found=true;
break;
}else if(matrix[row][column]>number){
--column;
}else{
++row;
}
}
}
return found;
}
优点:1、能解决问题
2、算法复杂度较小,为O(n)
关键点:使用了while循环。