搜索二维矩阵

73 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

题目

题目链接

编写一个高效的算法来判断m x n矩阵中,是否存在一个目标值。该矩阵具有如下特性:

  • 每行中的整数从左到右按升序排列。
  • 每行的第一个整数大于前一行的最后一个整数。  

示例 1:

image.png

输入: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出: true

示例 2:

image.png

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -104 <= matrix[i][j], target <= 104

解题

思路:二分查找

根据题目给的提示,我们可知:

  • 每一列的每个数字,该数之上的数字,都比其小;
  • 每一行的每个数字,该数右侧的数字,都比其大;

根据上面的提示,我们可以将这个二维数组看成是一个坐标轴

  1. 我们以坐标轴的左下角为起点res,与目标值进行比较
  2. 如果目标值大于res,说明res右边和下边的都不是我们要寻找的元素,res向上移动一位
  3. 如果目标值小于res,说明目标值可能在res右边,也可能在res下边,res向右移动一位
  4. 重复上述过程,直到找到目标值,返回true,否则返回false
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

代码:Java

public boolean searchMatrix(int[][] arr, int target) {
    int left = arr.length - 1;
    int right = 0;
    while (left >= 0 && right <= arr[0].length) {
        int mid = arr[left][right];
        if (mid == target) {
            return true;
        }else if (mid > target) {
            left--;
        }else {
            right++;
        }
    }
    return false;
}

提交结果

image.png