算法题解-搜索二维矩阵2

99 阅读2分钟

题目

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true

题解

第一种

我们声明一个searchMatrix函数,该函数接受一个二维矩阵和一个目标值作为参数,我们在声明一个findElement函数,在findElement函数中我们使用二分查找,将数组按中间值分为左右两部分,然后判断目标值与中间值的大小关系,进而缩小查找范围,如果找到了目标值就返回true,否则就返回false,我们接下来使用for循环遍历矩阵的每一行,并调用findElement函数来在该行中查找目标值,如果找到了目标值就返回true,如果矩阵中没有目标值就返回false即可

var searchMatrix = function(matrix, target) {
    for(const row of matrix){
        if(findElement(row, target)){
            return true;
        }
    }
    return false;
};
function findElement(nums, target){
    let l = 0, r = nums.length - 1;
    while(l < r){
        let mid = l + r >> 1;
        if(nums[mid] >= target) r = mid;
        else l = mid + 1;
    }
    return nums[l]===target;
}

第二种

我们在函数中使用两个指针i和j,分别指向矩阵的右上角,然后我们使用while循环不断缩小查找范围,直到找到目标值或者没有找到,循环的条件是i小于等于矩阵的行数减1,且j大于等于0,这么做是因为当i等于矩阵的行数时我们已经查找完了整个矩阵的所有行,当j小于0时我们已经查找完了整个矩阵的所有列,在循环中我们先判断右上角的元素是否小于目标值,如果小于目标值,则说明该元素所在的行的所有元素都比目标值小,可以将指针i向下移动一行,如果右上角的元素大于目标值,则说明该元素所在的列的所有元素都比目标值大,因此可以将指针j向左移动一列,如果右上角的元素等于目标值,就说明已经找到了目标值,我们直接返回true,如果在整个循环过程中都没有找到目标值,则说明目标值不在矩阵中我们直接可以返回false即可

var searchMatrix = function(matrix, target) {
    let i = 0, j =matrix[0].length-1
    while(i <= matrix.length-1 && j>=0 ){
        if(matrix[i][j]<target){
            i++
        }else if(matrix[i][j]>target){
            j--
        }else if(matrix[i][j]==target) {
            return true
        }
    }
    return false
};

坚持努力,无惧未来!