hot100-51搜索二维矩阵

一、题目

m×n的矩阵,每行中的整数从左到右递增排列,每行第一个整数大于前一行的最后一个整数。

给定矩阵和target,如果target在矩阵中,返回true,否则返回false。

二、思路

1、这个题目和 搜索二维矩阵 II 做法可以相同,从右上角开始搜索。如果当前值 大于 target → 向左走(排除这一列);如果当前值 小于 target → 向下走(排除这一行);如果相等 → 找到了!

2、这个题目的特性是,每行的第一个元素 > 上一行的最后一个怨怒是,说明所有行是严格递增拼接的,使用上面的解法时间复杂度是O(m+n),如果使用二分查找时间复杂度是O(log(mn))。

展开为一个一维数组,总长度m x n,在[0,N-1]范围内进行二分查找。对于任意一维索引mid,转换为二维坐标,行号:row=mid/n,列号:col=mid%n。比较matrix[m][n]与target,调整左右边界。

int row = mid / n; // 整除 → 得到"完整行数"

int col = mid % n; // 取余 → 得到"在该行中的偏移"

三、代码

复制代码
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length-1,n = matrix[0].length-1;
        int row = 0, col = n;
        while(row <= m && col >= 0){
            if(matrix[row][col] == target){
                return true;
            }else if(matrix[row][col] > target){
                col--;
            }else{
                row++;
            }
        }
        return false;
    }
}

做法二

复制代码
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length,n = matrix[0].length;
        int left=0,right = m*n -1;
        while(left <= right){
            int mid = left + (right - left) /2;
            int row = mid / n;
            int col = mid % n;
            if(matrix[row][col] == target){
                return true;
            }else if(matrix[row][col] < target){
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }
        return false;
    }
}
相关推荐
_不会dp不改名_1 小时前
leetcode_3010 将数组分成最小总代价的子数组 I
算法·leetcode·职场和发展
你撅嘴真丑2 小时前
字符环 与 变换的矩阵
算法
早点睡觉好了3 小时前
重排序 (Re-ranking) 算法详解
算法·ai·rag
gihigo19983 小时前
基于全局自适应动态规划(GADP)的MATLAB实现方案
算法
念越3 小时前
数据结构:栈堆
java·开发语言·数据结构
dear_bi_MyOnly4 小时前
【多线程——线程状态与安全】
java·开发语言·数据结构·后端·中间件·java-ee·intellij-idea
ctyshr4 小时前
C++编译期数学计算
开发语言·c++·算法
浪客灿心4 小时前
list_stack_queue
数据结构·list
zh_xuan4 小时前
最小跳跃次数
数据结构·算法
yumgpkpm4 小时前
2026软件:白嫖,开源,外包,招标,晚进场(2025年下半年),数科,AI...中国的企业软件产业出路
大数据·人工智能·hadoop·算法·kafka·开源·cloudera