在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
方法1
暴力遍历
var findNumberIn2DArray = function(matrix, target) {
var rowLength=matrix.length;
if(rowLength==0)
return false;
var colLength=matrix[0].length;
for(var i=0;i<rowLength;i++){
for(var j=0;j<colLength;j++){
if(matrix[i][j]==target)
return true;
}
}
return false;
};
方法2
我们将矩阵逆时针旋转 45° ,并将其转化为图形式,发现其类似于 二叉搜索树 ,即对于每个元素,其左分支元素更小、右分支元素更大。因此,通过从 “根节点” 开始搜索,遇到比 target 大的元素就向左,反之向右,即可找到目标值 target 。
从矩阵 matrix 右上角元素(索引设为 (i, j) )开始遍历,并与目标值对比:
当 matrix[i][j] > target 时,执行 i-- ,即消去第 i 行元素;
当 matrix[i][j] < target 时,执行 j++ ,即消去第 j 列元素;
当 matrix[i][j] = target 时,返回 true ,代表找到目标值。
若行索引或列索引越界,则代表矩阵中无目标值,返回 false 。
如果当前元素大于目标值,说明当前元素的下边的所有元素都一定大于目标值,因此往下查找不可能找到目标值,往左查找可能找到目标值。如果当前元素小于目标值,说明当前元素的左边的所有元素都一定小于目标值,因此往左查找不可能找到目标值,往下查找可能找到目标值。
var findNumberIn2DArray = function(matrix, target) {
if(matrix==null || matrix.length==0 || matrix[0].length==0)
return false;
var i=0;
var j=matrix[0].length-1;
while(i<matrix.length && j>=0){
if(matrix[i][j]>target)
j--;
else if(matrix[i][j]<target)
i++;
else
return true;
}
return false;
};