240. 搜索二维矩阵 II

 

二维数组搜索

编写一个高效的算法来搜索 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

给定 target = 20,返回 false

 
解题思路
有序矩阵,初步想法是二分查找,这样只能利用每行从左到右的升序,上下升序并没有利用到
 
二分解法
var searchMatrix = function(matrix, target) {
    for(let nums of matrix){
        let low = 0
        let high = nums.length-1
        while(low <= high){
            let mid = parseInt((low+high)/2)
            if(target===nums[mid]){
                return true
            }else if(target<nums[mid]){
                high = mid-1
            }else if(target>nums[mid]){
                low = mid+1
            }else {
                break;
            }
        }
    }
    return false
};

提交后通过

 

提交后查看优质解答

  每一行都是从左到右升序,上到下升序,因此右上角的值是这一行中最大,这一列中最小的值;根据这个思路也可以从左下角开始,左下角的值是这一行中最小,这一列最大的值;

 这里采用从右上角开始查找的方法,当target>当前值,向下查找,当target<当前值,向左查找,直到结束

 查找范围应该是 纵向查找的值不大于行数 横向查找的值不小于每行包含的元素

  第一次提交的时候没有处理特殊情况,因此在前面加上对  “[]” 、“[[]]”这两个测试用例的特殊处理之后提交通过了。

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

  

posted @ 2019-03-19 16:53  keiiha  阅读(451)  评论(0编辑  收藏  举报