【LeetCode Hot100】搜索二维矩阵 II[特殊字符]二分查找 vs 线性搜索,Java实现,图解+代码

news/2025/2/25 20:40:14

💻 [LeetCode Hot100] 搜索二维矩阵 II🔥二分查找 vs 线性搜索,Java实现,图解+代码

✏️本文对应题目链接:搜索二维矩阵 II


📌 题目描述

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

示例:

java">输入: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
解释:目标值 5 存在于矩阵中。

🧠 解题思路(图文分解)

❗ 核心难点

如何利用矩阵的特性高效搜索目标值?


方法一:线性搜索(黄金思路)✨

关键步骤:

  1. 从右上角开始搜索
    • 如果当前值等于 target,返回 true
    • 如果当前值大于 target,向左移动一列
    • 如果当前值小于 target,向下移动一行
  2. 终止条件:当行或列超出矩阵范围时停止

图解线性搜索

输入矩阵

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

步骤1:从右上角开始

初始位置:(0,4) → 15 > 5 → 向左移动

步骤2:向左移动

位置:(0,3) → 11 > 5 → 向左移动

步骤3:向左移动

位置:(0,2) → 7 > 5 → 向左移动

步骤4:向左移动

位置:(0,1) → 4 < 5 → 向下移动

步骤5:向下移动

位置:(1,1) → 5 == 5 → 找到目标值

最终结果:

true

🚀 代码实现

java">class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return false;
        }
        
        int row = 0, col = matrix[0].length - 1; // 从右上角开始
        
        while (row < matrix.length && col >= 0) {
            if (matrix[row][col] == target) {
                return true;
            } else if (matrix[row][col] > target) {
                col--; // 向左移动
            } else {
                row++; // 向下移动
            }
        }
        
        return false;
    }
}

💡 复杂度分析

  • 时间复杂度:O(m + n) → 最坏情况下需要遍历一行和一列
  • 空间复杂度:O(1) → 仅用常数空间

方法二:二分查找(优化思路)

关键思路:对每一行进行二分查找,适合列数较大的情况。

java">class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return false;
        }
        
        for (int[] row : matrix) {
            if (binarySearch(row, target)) {
                return true;
            }
        }
        
        return false;
    }
    
    private boolean binarySearch(int[] row, int target) {
        int left = 0, right = row.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (row[mid] == target) {
                return true;
            } else if (row[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return false;
    }
}

🌟 总结要点

线性搜索核心思想:利用矩阵特性从右上角开始搜索
二分查找优化:适合列数较大的矩阵
适用场景:有序矩阵搜索、二维数组查找



http://www.niftyadmin.cn/n/5865929.html

相关文章

采用TypeHandler对隐私数据自动加解密

前言 当我们写项目的时候&#xff0c;要对隐私数据进行加密和解密操作&#xff0c;可以不用每次都手动去写加密解密的代码&#xff0c;可以用Mybatis的TypeHandler来解决。 TypeHandler 具体意思就是&#xff0c;当我们处理某些特定字段时&#xff0c;可以在这个类里面实现一…

前端面试题---vue和react的区别

文章目录 框架 vs 库&#xff1a;学习曲线&#xff1a;模板 vs JSX&#xff1a;数据绑定&#xff1a;状态管理&#xff1a;性能&#xff1a;社区支持&#xff1a; 框架 vs 库&#xff1a; Vue 是一个完整的框架&#xff0c;提供了从模板到状态管理的全套解决方案&#xff1b;R…

全面理解-深拷贝与浅拷贝

在 C 中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09; 和 浅拷贝&#xff08;Shallow Copy&#xff09; 是两种完全不同的对象拷贝策略&#xff0c;主要区别在于对指针和动态分配资源的处理方式。正确理解二者的区别是避免内存泄漏、悬空指针和程序崩溃的关键。 一、核…

人工智能 阿里云算力服务器的使用

获取免费的阿里云服务器 阿里云免费使用地址&#xff1a; https://free.aliyun.com/ 选择 人工智能平台 PAI 选择交互式建模 再选建立实例。 选择对应的GPU 和镜像&#xff0c;点击确认。 注意&#xff1a;250个小时&#xff0c;用的时候开启&#xff0c;不用的时候关闭&…

虚拟机PING不通百度?NAT是什么?什么仅主机?

在虚拟机经常遇到一些网络问题&#xff0c;我也遇到了很多问题&#xff0c;在经过无数次试错后&#xff0c;我对这些有了一定的了解&#xff0c;和解决方式&#xff0c;下面我来谈谈我的经验&#xff0c;如有错误&#xff0c;请轻喷 下面都是我的口语&#xff0c;非正式&#…

LabVIEW中CFURL.llb 工具库说明

CFURL.llb 是 LabVIEW 2019 安装目录下 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\ 路径下的工具库&#xff0c;主要用于处理 LabVIEW 与 URL 相关的操作&#xff0c;涵盖 URL 解析、HTTP 请求发送、数据传输等功能模块&#xff0c;帮助开发者…

屏幕闪烁,相机能不能达到人眼视觉效果

你看着一个灯&#xff0c;光线稳定。然后你用相机拍照&#xff0c;结果发现有时并无光线。 你看着电子屏有字&#xff0c;用手机照相&#xff0c;只有部分字。如附图。 我想问&#xff0c;能不能从技术上改进&#xff0c;让照片、录像屏幕达到人眼视觉效果&#xff1f;

图像处理案例06 OCR应用

OCR应用 1 OCR读取账单1.1 背景及思路1.2 代码 1 OCR读取账单 1.1 背景及思路 思路 目标是读取图片中账单的信息。首先要截取图片上的账单&#xff0c;考虑到账单并非都是整齐摆放&#xff0c;为了保持算法的通用性&#xff0c;通过透视变换对扣取的账单摆正&#xff0c;然后调…