剑指offer -- 二维数组中的查找

news2024/11/25 11:02:37

二维数组中的查找_牛客题霸_牛客网 (nowcoder.com)

暴力查找法:

是一种简单直接的解决方法,可以用于在二维数组中查找目标值。该方法的思路是遍历数组的每个元素,逐个与目标值进行比较。

具体步骤如下:

  1. 从数组的第一行第一列开始,逐行逐列地遍历数组的每个元素。
  2. 对于当前遍历到的元素,与目标值进行比较:
    • 如果当前元素等于目标值,则找到目标值,返回true。
    • 如果当前元素大于目标值,则可以提前结束查找,因为数组已经按递增顺序排列,后续元素必定更大。
  3. 如果遍历完整个数组都没有找到目标值,则说明目标值不存在于数组中,返回false。
  4.  时间复杂度为O(m * n)
bool searchMatrix(vector<vector<int>>& matrix, int target) {
    for (int i = 0; i < matrix.size(); i++) {
        for (int j = 0; j < matrix[i].size(); j++) {
            if (matrix[i][j] == target) {
                return true;  // 找到目标值
            } else if (matrix[i][j] > target) {
                return false;  // 提前结束查找
            }
        }
    }
    
    return false;  // 目标值不存在于数组中
}

 

对于有序的二维数组,我们可以利用二分查找法进行查找目标值。

算法步骤:
1. 初始化指针,将左上角的元素作为起始点,将右下角的元素作为终止点。初始时,起始点为数组的左上角元素,终止点为数组的右下角元素。
2. 在每一次迭代中,将搜索区域一分为二,找到中间元素(可以选择行中间或列中间的元素)。
3. 将目标值与中间元素进行比较:
   - 如果中间元素等于目标值,则找到目标值,返回true。
   - 如果中间元素大于目标值,则目标值可能在中间元素的左侧或上方,将搜索区域缩小为左上方的子区域,即终止点变为中间元素的左上方元素。
   - 如果中间元素小于目标值,则目标值可能在中间元素的右侧或下方,将搜索区域缩小为右下方的子区域,即起始点变为中间元素的右下方元素。
4. 重复执行步骤2和步骤3,直到找到目标值或搜索区域为空(起始点超过终止点)为止。
5. 如果最终搜索区域为空,说明目标值不存在于数组中,返回false。

6.时间复杂度(cols*log(rows))

bool searchMatrix(vector<vector<int>>& matrix, int target) {
    if (matrix.empty() || matrix[0].empty()) {
        return false;  // 处理空数组的情况
    }

    int rows = matrix.size();
    int cols = matrix[0].size();
    int left = 0;
    int right = rows * cols - 1;

    while (left <= right) {
        int mid = left + (right - left) / 2;
        int midValue = matrix[mid / cols][mid % cols];

        if (midValue == target) {
            return true;  // 找到目标值
        } else if (midValue < target) {
            left = mid + 1;  // 目标值可能在中间元素的右侧或下方
        } else {
            right = mid - 1;  // 目标值可能在中间元素的左侧或上方
        }
    }

    return false;  // 目标值不存在于数组中
}

 

题目要求在一个二维数组中查找是否存在某个整数。该二维数组的特点是每一行从左到右递增,每一列从上到下递增。

解决该问题的一个思路是从二维数组的右上角开始比较,根据目标值与当前元素的大小关系,可以逐步缩小查找范围。具体步骤如下:

  1. 初始化指针row为0,指向第一行的最后一个元素,指针col为二维数组的列数减1,指向最后一列的第一个元素。
  2. 进入循环,比较当前指针指向的元素array[row][col]与目标值target的大小关系:
    • 如果array[row][col]等于target,说明找到了目标值,返回True
    • 如果array[row][col]大于target,说明目标值可能在当前元素的左侧,将指针col向左移动一列。
    • 如果array[row][col]小于target,说明目标值可能在当前元素的下方,将指针row向下移动一行。
  3. 如果指针rowcol超出了二维数组的边界,则说明查找范围已经越界,目标值不存在于二维数组中,返回False
  4. 空间复杂度O(m+n)
#include <iostream>
#include <vector>

using namespace std;

bool findTarget(vector<vector<int>>& array, int target) {
    if (array.empty() || array[0].empty()) {
        return false;
    }

    int rows = array.size();
    int cols = array[0].size();
    int row = 0;
    int col = cols - 1;

    while (row < rows && col >= 0) {
        if (array[row][col] == target) {
            return true;
        } else if (array[row][col] > target) {
            col--;
        } else {
            row++;
        }
    }

    return false;
}

int main() {
    vector<vector<int>> array = {
        {1, 2, 8, 9},
        {2, 4, 9, 12},
        {4, 7, 10, 13},
        {6, 8, 11, 15}
    };

    int target1 = 7;
    int target2 = 3;

    cout << boolalpha << findTarget(array, target1) << endl;  // 输出: true
    cout << boolalpha << findTarget(array, target2) << endl;  // 输出: false

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Scala学习(十)---Set和Map

文章目录 1.Set集合1.1 不可变Set1.2 可变Set 2.Map2.1 不可变Map2.2 可变map 3.元组 1.Set集合 1.1 不可变Set 创建一个不可变set val setSet(1,2,3,4,6,5,4,4)println(set)//判断此set是否为不可变HashSetval bool set.isInstanceOf[HashSet[Int]]println(bool)运行&#…

考研数据结构--图

文章目录 图图的基本概念图的定义种类 图的抽象数据类型图的基本术语1. 端点和邻接点2. 顶点的度、入度和出度3. 完全图4. 稠密图、稀疏图5. 子图6. 路径和路径长度7. 回路或环8. 连通、连通图和连通分量9. 强连通图和强连通分量在一个图中找强连通分量的方法 10. 权和网 图的存…

如何在华为OD机试中获得满分?Java实现【统计匹配的二元组个数】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

基于openfaas托管脚本的实践

作者 | 张曦 一、openfaas产品背景 在云服务架构发展之初&#xff0c;这个方向上的思路是使开发者不需要关心搭建和管理后端应用程序。这里并没有提及无服务器这个概念&#xff0c;而是指后端基础设施由第三方来托管&#xff0c;需要的基础架构组建均以服务的形式提供&#x…

list的模拟实现

第一步&#xff1a;看源代码 类的框架&#xff1a; 成员函数&#xff1a; 基本可以确定list是一个带头双向循环链表&#xff0c;end()的迭代器指向头节点&#xff0c;begin()的迭代器指向头结点的下一个节 list的迭代器&#xff1a;&#xff08;稍显复杂&#xff09; 库中的迭代…

5节点系统潮流计算-牛拉法和PQ分解法(代码+报告)

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该部分资料是牛拉法和PQ分解法两种潮流计算方法的代码和对应的资料&#xff0c;程序针对5节点系统&#xff0c;也可以自行修改节点和线路参数改成其他节点系统&#xff0c;程序通用性较强&#xff0c;注释清晰…

电脑没有声音了怎么恢复?3个实用方法分享!

案例&#xff1a;我想在电脑上看电影、听音乐&#xff0c;但是我发现电脑没有声音&#xff0c;这种情况让我感到很困扰&#xff0c;有没有解决的方法&#xff1f; 【我的电脑没有声音&#xff0c;这非常影响我的使用。电脑没有声音是什么问题&#xff1f;有没有小伙伴知道解决…

Recurrent Neural Network(循环神经网络)

目录 Slot Filling with RNN Elman Network & Jordan Network Bidirectional RNN LSTM(Long Short-term Memory) Example Learning Target LSTM GRU (Gated Recurrent Unit) More Applications Many to One Many to Many Speech Recognition Sequence to Sequ…

一大波物联网毕业设计选题推荐(配套源码、文档、开发板)

以下项目整体综合性比较强&#xff0c;更贴近于产品化&#xff0c;并且基本都包含微信小程序与物联网云平台的联动&#xff0c;每个项目均配套详细的项目开发文档、程序源码&#xff0c;非常适合作为物联网毕业设计选题。项目文档及源码在文章末尾可免费下载。 另外&#xff0…

新手上路——怎样给我的网站备案

怎样办理网站备案&#xff1a; 由于备案是在主机接入商处办理&#xff0c;通常在哪里买的网站空间在哪里提交备案。例如在西部数码开通的虚拟主机、云服务器、独立主机等业务后&#xff0c;再通过其平台提交备案申请。 1.主机业务开通成功后&#xff0c;打开备案平台网址&…

【uniapp】app端压窗屏设计

一、前言 众所周知&#xff0c;在app端中&#xff0c;普通的组件是无法覆盖原生组件&#xff0c;即使是官方提供的cover-view也只是在实体内容中覆盖一些原生的如地图。但是无法覆盖底部的tabbar。 二、了解层级关系 实际上app端每点击一次的层级是这样的&#xff0c;我们可…

spring security oauth2.0-authorization code

Oauth2.0 spring security 估计很多人都在用,里面有几种安全模式值得大家去摸索. oauth2.0 是一种授权鉴权的机制,主要是用来颁发令牌,验证令牌,刷新令牌. OAuth2.0是OAuth协议的延续版本&#xff0c;但不向前兼容OAuth 1.0(即完全废止了OAuth1.0). 2012年10月&#xff0c…

泛微e-cology9 SQL注入漏洞复现(QVD-2023-5012)

1、产品简介 泛微协同管理应用平台e-cology是一套兼具企业信息门户、知识文档管理、工作流程管理、人力资源管理、客户关系管理、项目管理、财务管理、资产管理、供应链管理、数据中心功能的企业大型协同管理平台。 2、漏洞概述 泛微e-cology9中存在SQL注入漏洞&#xff0c;未…

《数据万象带你玩转视图场景》第三期:图片极智压缩

前言 在本系列的第一期我们介绍了图片 AVIF 压缩&#xff0c;作为最前沿的压缩技术&#xff0c;AVIF 确实有着无数的优点。但时代的进步是循序渐进的&#xff0c;在一些较老的终端或设备上&#xff0c;可能短时间内确实无法支持 AVIF 格式&#xff0c;那如何能让这部分业务享受…

【毕业季征文】你们的未来可期

还有大约一个月即将又有一批大学的学弟学妹们离开学校,走向社会,走上工作岗位。你们是否是既兴奋又迷茫呢?,我相信更多的是憧憬吧。回想我大学毕业那是10年前的事情了,现在的感受是那么遥远,仿佛自己从来都没上过大学。可能是在大学期间过的太过艰苦,以至于不想保留那一…

TDengine客户端连接

目录 TDengine-clinet 下载网址 运行软件 连接默认TD 连接指定TD TDengineGUI 下载地址 使用 连接&#xff1a;端口默认是6041&#xff1b; sql查询时需要制定 库名 TDengine-clinet 下载网址 连接器 | TDengine 文档 | 涛思数据 默认安装即可; 运行软件 连接默认TD…

机器学习期末复习 线性模型

1.线性回归&#xff0c;对数几率回归&#xff0c;线性判别分析是分类还是回归任务&#xff1f;是有监督的学习还是无监督的学习&#xff1f; 有监督学习和无监督学习 解释&#xff1a; 线性模型要做的有两类任务&#xff1a;分类任务、回归任务 分类的核心就是求出一条直线w…

JavaScript之BOM(上)

Window对象 1.BOM(浏览器对象模型) 2.定时器-延时函数 3.JS执行机制 4.location对象 5.navigator对象 6.history对象 一.BOM(浏览器对象模型) 1.BOM(Browser Object Model)是浏览器对象模型 2.window对象是一个全局对象&#xff0c;也可以说是JavaScript中的顶级对象 3.像do…

Facebook速推帖子和Facebook广告有什么区别

Facebook速推帖子和Facebook广告是在Facebook平台上推广内容的两种不同方式。虽然它们都可以帮助我们增加品牌曝光和吸引目标受众&#xff0c;但它们在运作方式和效果上有一些区别。让我们来详细了解一下它们之间的差异。 1.内容形式和展示方式&#xff1a; Facebook速推帖子&…

基于北斗+LoRa的落水报警定位方案一 -实现无人区,弱信号地区人员 位置安全监控

人员安全一直是企业管理的重中之重。无人区工地是一个安全事故多发的地方&#xff0c;在施工环境复杂且危险的情况下&#xff0c;工地人员位置监控成为管理工作中的一个难点&#xff0c;一直以来采用粗放的方式&#xff0c;现有的工地项目存在施工人员实时督查难等问题&#xf…