寻找目标值 (最优解)

news/2024/12/28 23:41:39/

题目来源

LCR 121. 寻找目标值 - 二维数组 - 力扣(LeetCode)


题目描述

m*n 的二维数组 plants 记录了园林景观的植物排布情况,具有以下特性:

  • 每行中,每棵植物的右侧相邻植物不矮于该植物;
  • 每列中,每棵植物的下侧相邻植物不矮于该植物。

请判断 plants 中是否存在目标高度值 target

示例 1:

输入:plants = [[2,3,6,8],[4,5,8,9],[5,9,10,12]], target = 8输出:true

示例 2:

输入:plants = [[1,3,5],[2,5,7]], target = 4输出:false

题目限制

最优解 

时间复杂度O(n*m)


思路分析

1. 常规暴力思路及其不足

  • 暴力思路:最直接的方法是遍历整个二维数组。通过两层嵌套循环,外层循环遍历行,内层循环遍历列,对数组中的每一个元素都进行检查,看其是否等于目标值 target
  • 不足:这种方法的时间复杂度为 ,当数组规模较大时,效率较低。因为我们没有利用到数组元素有序排列的特性。

2. 高效查找思路:从右上角开始搜索

  • 起始位置选择:选择数组的右上角元素 plants[0][n - 1] 作为起始搜索位置。这是因为该位置具有特殊的性质,它在所在行中是最大的,在所在列中是最小的。
  • 比较与移动策略
    • 相等情况:当当前元素 plants[row][col] 等于目标值 target 时,说明找到了目标值,直接返回 True
    • 当前元素大于目标值:由于当前行中,当前元素右侧的元素都不小于它,所以右侧元素肯定都大于目标值,不可能是我们要找的目标,因此可以向左移动一列(即 col -= 1),继续在新的列上进行比较。
    • 当前元素小于目标值:因为当前列中,当前元素下方的元素都不小于它,所以下方元素都大于目标值,我们需要向下移动一行(即 row += 1),在新的行上继续查找。
  • 终止条件:当行索引 row 超出数组的行数(即 row >= m)或者列索引 col 小于 0 时,说明整个数组中不存在目标值,返回 False

通过这种方式,每次比较后我们都能有效地排除一行或一列,大大减少了搜索空间,使得时间复杂度降低到 ,相比于暴力搜索有了显著的性能提升。

例如,对于示例 1 中的数组 plants = [[2,3,6,8],[4,5,8,9],[5,9,10,12]] 和目标值 target = 8

  • 从右上角元素 plants[0][3] = 8 开始,它恰好等于目标值,直接返回 True

再看示例 2 中的数组 plants = [[1,3,5],[2,5,7]] 和目标值 target = 4

  • 起始于右上角元素 plants[0][2] = 5,因为 5 > 4,向左移动一列,此时 col = 1
  • 比较 plants[0][1] = 3,由于 3 < 4,向下移动一行,此时 row = 1
  • 比较 plants[1][1] = 5,因为 5 > 4,向左移动一列,此时 col = 0
  • 比较 plants[1][0] = 2,由于 2 < 4,向下移动一行,此时 row = 2,超出了数组的行数,所以返回 False

这种基于数组特性的查找思路,能够帮助我们在有序二维数组中高效地定位目标值。


具体代码

class Solution {
public:bool findTargetIn2DPlants(vector<vector<int>>& plants, int target) {if(plants.size()==0)return false;int m=plants.size();int n=plants[0].size();int i=m-1,j=0;while(i>=0 && j<=n-1){if(plants[i][j]>target){i--;}else if(plants[i][j]<target){j++;}else{return true;}}return false;}
};

这段 C++ 代码定义了Solution类中的findTargetIn2DPlants函数,用于在二维数组plants中查找目标值target。先检查数组是否为空,若空则直接返回false;接着获取数组行数m和列数n,从左下角元素开始搜索,通过循环比较当前元素与target,大于target时向上移动一行,小于target时向右移动一列,相等则返回true,循环结束未找到则返回false ,利用数组特性实现高效查找。


http://www.ppmy.cn/news/1558919.html

相关文章

智慧楼盘二维、三维组件融合 720三维全景可视化

本系统通过数字孪生技术&#xff0c;实现小区楼盘系统的可视化展示&#xff0c;整合楼盘内各个系统的数据源&#xff0c;将楼盘模型与房间模型、720三维全景图相结合&#xff0c;实现了从楼盘周边到室内布局的全方位展示&#xff0c;为购房者提供全方位的可视化信息。 整个项目…

鸿蒙Next如何实现打开相册选图片功能?

问题描述&#xff1a;鸿蒙Next如何实现打开相册选图片功能 应用场景&#xff1a;用户个人中心自定义头像的时候&#xff0c;需要选择相册上传照片。 解决方案&#xff1a; 使用picker这个API实现从系统上获取相册图片这个点的&#xff0c; 1、首先要实例一个选择参数PhotoS…

《网络对抗》—— Web安全基础实践

1.实验后回答问题 &#xff08;1&#xff09;SQL注入攻击原理&#xff0c;如何防御. 原理&#xff1a; SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序&#xff0c;而这些输入大都是SQL语法里的一些组合&#xff0c;通过执行SQL语句进而执行攻击者所要的操作&a…

AutoFOX:一种冠状动脉X线造影与OCT的自动化跨模态3D融合框架|文献速递-视觉大模型医疗图像应用

Title 题目 AutoFOX: An automated cross-modal 3D fusion framework of coronary X-ray angiography and OCT AutoFOX&#xff1a;一种冠状动脉X线造影与OCT的自动化跨模态3D融合框架 01 文献速递介绍 冠状动脉疾病&#xff08;CAD&#xff09;仍是全球范围内的主要死亡原…

【FPGA】ISE13.4操作手册,新建工程示例

关注作者了解更多 我的其他CSDN专栏 求职面试 大学英语 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处…

《操作系统真象还原》第十章(一) —— 同步机制之互斥锁实现与输出系统

本章节所有代码托管在miniOS_32 章节任务介绍 问题复现 在上一节中&#xff0c;我们实现了线程轮转调度&#xff0c;并分别实现了三个线程并发的在终端进行输出打印 主线程 thread_work_a thread_work_b #include "print.h" #include "init.h" #inc…

深度解析:电商平台API接口的安全挑战与应对策略

随着电子商务的蓬勃发展&#xff0c;电商平台与外部服务、内部系统之间的数据交换和通信变得日益频繁。API&#xff08;应用程序编程接口&#xff09;接口作为这一过程中的关键枢纽&#xff0c;其安全性显得尤为重要。API接口不仅承载着商品管理、订单处理、支付结算、用户管理…

dolphinscheduler服务RPC心跳机制之实现原理与源码解析

RPC心跳机制设计 1.概述2.设计2.1.心跳机制流程设计2.1.1.常规RPC心跳机制设计2.1.2.Dolphinscheduler的RPC心跳机制设计2.2.心跳机制数据模型设计2.3.心跳机制动态配置3.实现3.1.心跳机制数据模型3.1.1.HeartBeat接口3.1.2.基础实现类BaseHeartBeat3.1.3.Master服务中的心跳消…