240. 搜索二维矩阵 II

时间:2023-03-08 21:23:35

二维数组搜索

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

提交后通过

240. 搜索二维矩阵 II

提交后查看优质解答

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

 这里采用从右上角开始查找的方法,当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
};

  240. 搜索二维矩阵 II