4. 搜索二维矩阵

56 阅读1分钟

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