编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
示例 1:
输入: 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
分析
这个题目的思路,本身其实用二分分治,对每个子数组处理也行,但是这个题目的巧妙在于,观察发现这个数组本身是有序的从各个顶点开始遍历是不同的,你从右上角,和左下角进行遍历才能进行减少重复,如果还是传统左上角,发现,你无法判断,到底哪个方向,因为值都是递增。
/**
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
// 右上角开始遍历,遇到小于向左移动反之向下
var searchMatrix = function(matrix, target) {
let i = 0;
let j = matrix[0].length - 1
while(j>=0&& i<matrix.length){
let targetValue = matrix[i][j];
if(targetValue > target){
j --
}else if(targetValue <target){
i ++
}else {
return true
}
}
return false
};
二分做法
/**
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
var searchMatrix = function(matrix, target) {
const splitTwo = (left,right,arr)=>{
// let mid = Math.floor((left + right) /2);
// const mid = Math.floor((right - left) / 2) + left;
while(left <=right){
const mid = Math.floor((right - left) / 2) + left;
if(arr[mid] >target){
right = mid-1
}else if(arr[mid] < target){
left = mid +1
}else {
return arr[mid]
}
}
return null
}
for(let i = 0;i<matrix.length;i++){
let targetVal = splitTwo(0,matrix[0].length-1,matrix[i]);
if(targetVal === target){
return true
}
}
return false
};js