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 };