LeetCode-074-搜索二维矩阵

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

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

示例 1:

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

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

示例 3:

输入:matrix = [], target = 0
输出:false

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-a-2d-matrix

解题思路

由于矩阵本身是左小右大, 上小下大, 所以如果先从最右上角的数字开始比较
int i = 0; int j = matrix[0].length - 1;
如果该数等于目标数, 直接返回
如果该数小于目标数, 由"左小右大"的特性, 该数所在行所有数都小于目标数, 则直接忽略该行, 将比较的数位置往下挪一行i++
如果该数大于目标数, 由"上小下大"的特性, 该数所在列所有数都大于目标数, 则直接忽略该列, 将比较的数位置往左挪一列j--

代码

class Solution {
    // 从左到右递增, 从上到下递增
    public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix == null || matrix.length == 0) {
            return false;
        }
        int m = matrix.length;
        int n = matrix[0].length;
        // 遍历时从"右上角"开始遍历
        for (int i = 0, j = n - 1; i < m && j >= 0; ) {
            if (matrix[i][j] == target) {
                return true;
            } else if (matrix[i][j] < target) { // 当前数小于目标数
                // 则直接忽略该行, 因为每一行从左到右递增
                i++;
            } else { // 当前数大于目标数
                // 则直接忽略该列, 因为每一列从上到下递增
                j--;
            }
        }
        return false;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目:编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性: 每行中的整数从左到右...
    minningl阅读 272评论 0 0
  • 题目描述:编写一个高效的算法来判断m x n矩阵中,是否存在一个目标值。该矩阵具有如下特性: 每行中的整数从左到右...
    windUtterance阅读 81评论 0 0
  • LeetCode 第 74 题:二维矩阵的搜索 传送门:74. 搜索二维矩阵。 编写一个高效的算法来判断 m x...
    李威威阅读 523评论 0 0
  • 题目 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性: 每行中的整数从左到右...
    LonnieQ阅读 189评论 0 1
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,557评论 16 22