【算法】【线性表】【数组】搜索二维矩阵

1  题目

给你一个满足下述两条属性的 m x n 整数矩阵:

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

示例 1:

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

示例 2:

输入: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

2  解答

先定位在第几行, 然后从该行进行二分查找:

复制代码
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        // 根据特性,先判断target 在哪一行
        int i = 0;
        for (; i < matrix.length; i++) {
            if (matrix[i][0] == target) {
                return true;
            }
            if (matrix[i][0] < target) {
                continue;
            }
            // 因为在上一行 所以 i--
            if (i > 0) {
                i--;
            }
            break;
        }
        // 不是 break出来的,正常遍历出来的 需要-- 表示最后一行进行二分查找
        if (i == matrix.length) {
            i--;
        }
        return twoSearch(matrix[i], 0, matrix[i].length - 1, target);
    }
    // 二分查找判断
    public boolean twoSearch(int[] nums, int start, int end, int target) {
        if (start > end) {
            return false;
        }
        int middle = start + (end - start) / 2;
        if (nums[middle] == target) {
            return true;
        } else if (nums[middle] < target) {
            return twoSearch(nums, middle + 1, end, target);
        } else {
            return twoSearch(nums, start, middle - 1, target);
        }
    }
}
复制代码

加油。

posted @   酷酷-  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示