有序二维矩阵中的目标值查找

目录

  • 有序二维矩阵中的目标值查找
    • 1. 题目描述
    • 2. 问题解释
    • 3. 解决思路
      • 方法一:逐行二分查找(适合行数较少的情况)
      • 方法二:利用行列有序特性(最优解)
    • 4. 代码实现
    • 5. 总结

1. 题目描述

给定一个元素为非负整数的二维数组matrix,其中:

  • 每一行按照从左到右递增的顺序排列
  • 每一列按照从上到下递增的顺序排列

再给定一个非负整数aim,请判断aim是否存在于matrix中。

示例

int[][] matrix = {{1, 4, 7, 11},{2, 5, 8, 12},{3, 6, 9, 16},{10, 13, 14, 17}
};
int aim = 5; // 返回true
int aim = 15; // 返回false

2. 问题解释

  • 矩阵行列均有序,但不像完全排序的一维数组那样可以直接二分
  • 需要利用行列有序的特性设计高效查找算法
  • 暴力搜索时间复杂度为O(m*n),不够高效
  • 目标是设计优于O(m*n)的算法

3. 解决思路

方法一:逐行二分查找(适合行数较少的情况)

  • 对每一行进行二分查找
  • 时间复杂度:O(m log n),m为行数,n为列数

方法二:利用行列有序特性(最优解)

  1. 从矩阵的右上角开始查找(或左下角)
  2. 比较当前元素与目标值:
    • 如果等于目标值,返回true
    • 如果大于目标值,排除当前列(向左移动)
    • 如果小于目标值,排除当前行(向下移动)
  3. 时间复杂度:O(m + n)

4. 代码实现

public class SearchInSortedMatrix {// 方法一:逐行二分查找public boolean searchMatrixByRowBinarySearch(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;}// 方法二:利用行列有序特性(最优解)public boolean searchMatrix(int[][] matrix, int target) {if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {return false;}int row = 0;int 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;}public static void main(String[] args) {SearchInSortedMatrix solution = new SearchInSortedMatrix();int[][] matrix = {{1, 4, 7, 11},{2, 5, 8, 12},{3, 6, 9, 16},{10, 13, 14, 17}};System.out.println(solution.searchMatrix(matrix, 5)); // trueSystem.out.println(solution.searchMatrix(matrix, 15)); // falseSystem.out.println(solution.searchMatrixByRowBinarySearch(matrix, 9)); // trueSystem.out.println(solution.searchMatrixByRowBinarySearch(matrix, 20)); // false}
}

5. 总结

  1. 方法选择

    • 当行数远小于列数时,方法一(逐行二分)可能更优
    • 一般情况下,方法二(行列排除法)是最优解
  2. 复杂度分析

    • 方法一:O(m log n)
    • 方法二:O(m + n)
  3. 关键点

    • 利用矩阵行列有序的特性
    • 选择合适的起点(右上角或左下角)
    • 每次比较都能排除一行或一列
  4. 扩展思考

    • 如果矩阵是完全排序的(即展平后有序),可以直接使用一维二分查找
    • 如果矩阵中存在重复元素,算法依然适用
  5. 实际应用

    • 数据库索引查找
    • 图像处理中的像素查找
    • 游戏地图中的坐标查找

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86720.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86720.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/86720.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解AVL树及其旋转操作

AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单枝树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种方法…

URL带有中文会引入哪些问题

处理含中文字符的 URL 1 为什么会出现“乱码”或崩溃&#xff1f; URL 标准&#xff08;RFC 3986&#xff09;规定&#xff1a;除少数保留字符外&#xff0c;URL 只能包含 ASCII。中文属于 Unicode&#xff0c;因此必须先转换。如果直接把 https://example.com/路径/ 这样的字…

结构体字段能否单独加 mut

你问的这个问题在 Rust 里很常见&#xff1a; 一、结构体字段能否单独加 mut 1. 结构体字段能否单独加 mut&#xff1f; 不能。Rust 中&#xff0c;mut 是用来修饰变量绑定的&#xff0c;可变性是绑定的属性&#xff0c;而不是结构体字段本身的属性。 你不能写&#xff1a; …

scGPT-spatial 复现

文章目录 ✅ 总体流程总览&#xff08;从 H5AD 到模型训练&#xff09;&#x1f527; 步骤 1&#xff1a;读取 H5AD 文件并做基础预处理&#x1f9f1; 步骤 2&#xff1a;构造训练样本输入&#xff08;token、value&#xff09;&#x1f4e6; 步骤 3&#xff1a;使用 DataColla…

运放电压跟随器为什么要加电阻

运放电压跟随器为什么要加电阻 我们常见运放的电压跟随器如下&#xff1a; 有时候会看见电路中加两个电阻&#xff1a; 作用就是保护运放&#xff0c;起限流电阻的作用。 当输入电压高的时候&#xff0c;运放内部存在钳位二极管&#xff0c;此电阻就能限流。 并不是所有运放…

MinerU 2.0部署

简介 MinerU 2.0使用sglang加速&#xff0c;与之前差别较大&#xff0c;建议按照官方的Docker镜像的方式启动。 Docker镜像 Dockerfile 这是官方的Dockerfile # Use the official sglang image FROM lmsysorg/sglang:v0.4.7-cu124# install mineru latest RUN python3 -m …

黑马python(十七)

目录&#xff1a; 1.数据可视化-地图-基础案例 2.全国疫情地图 3.河南省疫情地图绘制 4.基础柱状图构建 5.基础时间线柱状图绘制 6.动态GDP柱状图绘制 1.数据可视化-地图-基础案例 图示有点对的不准&#xff0c;可以通过后面的参数 2.全国疫情地图 3.河南省疫情地图绘制…

Segment Anything in High Quality之SAM-HQ论文阅读

摘要 最近的 Segment Anything Model(SAM)在扩展分割模型规模方面取得了重大突破,具备强大的零样本能力和灵活的提示机制。尽管 SAM 在训练时使用了 11 亿个掩码,其掩码预测质量在许多情况下仍不理想,尤其是对于结构复杂的目标。我们提出了 HQ-SAM,使 SAM 能够精确地分割…

深入理解_FreeRTOS的内部实现(2)

1.事件组 事件组结构体&#xff1a; 事件组 “不关中断” 的核心逻辑 事件组操作时&#xff0c;优先选择 “关调度器” 而非 “关中断” &#xff0c;原因和实现如下&#xff1a; 关调度器&#xff08;而非关中断&#xff09; FreeRTOS 提供 taskENTER_CRITICAL()&#xff08;…

【图论题典】Swift 解 LeetCode 最小高度树:中心剥离法详解

文章目录 摘要描述题解答案题解代码分析思路来源&#xff1a;树的“中心剥离法”构造邻接表和度数组循环剥叶子终止条件 示例测试及结果时间复杂度空间复杂度总结 摘要 树是一种重要的数据结构&#xff0c;在许多应用里&#xff0c;我们希望选一个根&#xff0c;让这棵树的高度…

Docker的介绍与安装

​ Docker 对初学者的简单解释和应用场景 1.什么是 Docker&#xff1f; 简单来说&#xff0c;Docker 就像一个“装箱子”的工具&#xff0c;这个箱子叫做“容器”。 你写的程序和它运行需要的环境&#xff08;比如操作系统、软件、工具&#xff09;都装进一个箱子里。这个箱…

引导相机:工业自动化的智能之眼,赋能制造业高效升级

在工业自动化浪潮中&#xff0c;精准的视觉引导技术正成为生产效率跃升的关键。作为迁移科技——一家成立于2017年、专注于3D工业相机和3D视觉系统的领先供应商&#xff0c;我们深知"引导相机"的核心价值&#xff1a;它不仅是一个硬件设备&#xff0c;更是连接物理世…

智能相机如何重塑工业自动化?迁移科技3D视觉系统的场景革命

从硬件参数到产业价值&#xff0c;解码高精度视觉系统的落地逻辑 一、工业视觉的“智慧之眼” 迁移科技深耕3D工业相机领域&#xff0c;以“稳定、易用、高回报”为核心理念&#xff0c;打造覆盖硬件、算法、软件的全栈式视觉系统。成立6年累计融资数亿元的背后&#xff0c;是…

【数据挖掘】聚类算法学习—K-Means

K-Means K-Means是一种经典的无监督学习算法&#xff0c;用于将数据集划分为K个簇&#xff08;clusters&#xff09;&#xff0c;使得同一簇内的数据点相似度高&#xff0c;不同簇间的相似度低。它在数据挖掘、模式识别和机器学习中广泛应用&#xff0c;如客户细分、图像压缩和…

linux环境内存满php-fpm

检查 PHP-FPM 配置 pm.max_children&#xff1a;该参数控制 PHP-FPM 进程池中最大允许的子进程数。过高的子进程数会导致内存占用过大。你可以根据服务器的内存大小来调整 pm.start_servers&#xff1a;控制 PHP-FPM 启动时创建的进程数。根据实际情况调整此值。 pm.min_spare_…

基于CNN卷积神经网络图像识别小程序9部合集

基于CNN卷积神经网络图像识别小程序合集-视频介绍下自取 ​ 内容包括&#xff1a; 基于python深度学习的水果或其他物体识别小程序 003基于python深度学习的水果或其他物体识别小程序_哔哩哔哩_bilibili 代码使用的是python环境pytorch深度学习框架&#xff0c;代码的环境安…

WebRTC(九):JitterBuffer

JitterBuffer Jitter “Jitter”指的是连续到达的媒体包之间时间间隔的变化。在网络传输中&#xff0c;由于&#xff1a; 网络拥塞路由路径变化队列排队不同链路带宽差异 导致包之间的接收时间不一致&#xff0c;这就是网络“抖动”。 作用 **JitterBuffer&#xff08;抖…

【推荐100个unity插件】在 Unity 中绘制 3D 常春藤,模拟生长——hedera插件的使用

注意&#xff1a;考虑到后续接触的插件会越来越多&#xff0c;我将插件相关的内容单独分开&#xff0c;并全部整合放在【推荐100个unity插件】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 效果演示 文章目录 效果演示前言一、常春藤生成器工具下载二、工具使用1、…

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的几何变换

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的几何变换 文章目录 【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的几何变换前言模型变换(Model Transformation)观测变换(Viewing Transformation)视图变换(View Transformation)投影…

EXISTS 和 NOT EXISTS 、IN (和 NOT IN)

在 SQL 中&#xff0c;EXISTS、NOT EXISTS 和 IN 都是用于子查询的条件运算符&#xff0c;用于根据子查询的结果过滤主查询的行。它们之间的区别主要体现在工作方式、效率、对 NULL 值的处理以及适用场景上。 1. EXISTS 和 NOT EXISTS 作用&#xff1a; EXISTS: 检查子查询是…