【剑指offer-C++】JZ4 - 二维数组中的查找

news/2024/7/20 22:52:40 标签: c++, 深度优先, 算法

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

    • 题目描述
    • 解题思路

题目描述

描述:在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]

给定 target = 7,返回 true。
给定 target = 3,返回 false。

数据范围:矩阵的长宽满足0≤n,m≤500 ,矩阵中的值满足 0≤val≤109

进阶:空间复杂度O(1) ,时间复杂度O(n+m)。

输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:true
说明:存在7,返回true 
输入:1,[[2]]
返回值:false
输入:3,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:false
说明:不存在3,返回false

解题思路

二维数组中的查找:最直观的想法是,两层for循环直接暴力查找,很显然超时,那么考虑到二维数组从左到右有序,从上到下有序,则使用深度优先搜索dfs,当array[i][j]小于target时,向右搜或者向下搜,很显然也超时,故使用记忆化搜索ms,用一个二维数组memo来记录dfs[i][j]的结果,通过。

bool dfs(vector<vector<int>> &memo,vector<vector<int>> &array,int target,int i,int j)
{
	if(i>=array.size()||j>=array[0].size())
    return false;
    if(memo[i][j]!=-1)  //如果memo为bool类型反而不好初始化
    return memo[i][j];
    if(array[i][j]>target)
    return false;
    if(array[i][j]==target)
    return true;
    if(array[i][j]<target)
    memo[i][j] = dfs(memo,array,target,i+1,j)||dfs(memo,array,target,i,j+1);
    return memo[i][j];  //int与bool的隐式转换
}
bool Find(int target, vector<vector<int> > array) 
{
	vector<vector<int>> memo(array.size(),vector<int>(array[0].size(),-1));
    return dfs(memo,array,target,0,0);
}

优化:如果是在有序的一维数组中查找,那么会想到二分查找,小于则在中点向左查找,大于则在中点向右查找,那么在有序的二维数组中又该如何查找呢?将中点设置在右上角,小于则在中点向左查找,大于则在中点向下查找。

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

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

相关文章

Python中__init__.py文件深入理解

Python中文件__init__.py深入理解1. 简介1.1 模块&#xff08;Module&#xff09;和包&#xff08;Package&#xff09;的概念1.2 __init__.py文件简介2. __init__.py内容写法2.1 __init__.py文件内容2.2 __init__.py内容解释1. 简介 1.1 模块&#xff08;Module&#xff09;和…

【GD32F427开发板试用】2. RT-Thread标准版移植

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;hehung 之前的帖子 【GD32F427开发板试用】1. 串口实现scanf输入控制LED 前言 一个嵌入式系统对于单片机开发可以事半功倍&#xff0c;目前…

ZooKeeper 避坑实践: Zxid溢出导致选主

作者&#xff1a;子葵 背景 线上 flink 用户使用 ZooKeeper 做元数据中心以及集群选主&#xff0c;一些版本的 flink 在 ZooKeeper 选主时&#xff0c;会重启 Job&#xff0c;导致一些非预期的业务损失。而 ZooKeeper 在 zxid溢出时&#xff0c;会主动触发一次选主&#xff0…

设计模式之命令模式,以C++为例。

命令模式一般叫&#xff1a;command模式&#xff0c;它将请求的发送者和接受者独立开。命令模式的目的是使得请求的发送者与请求的接收者解耦&#xff0c;并且使得请求的发送者可以控制请求的接收者。 目录 一、命令模式能干什么&#xff1f; 二、多级命令 三、进阶写法 一…

OpenStack云平台搭建(3) | 部署Glance

目录 1、登录数据库授权 2、安装glance 3、测试一下 安装部署Glance镜像服务 Image Service 镜像服务&#xff1a;代号&#xff1a;Glance&#xff1a;为云平台虚拟机提供镜像服务&#xff0c;例如&#xff1a;上传镜像、删除镜像等。说明&#xff1a;镜像&#xff1a;磁盘…

18. 构造函数和析构函数,构造函数的分类和调用

构造函数和析构函数 构造函数 //没有返回值 不用写void//函数名 与 类名相同//可以有参数 ,可以发生重载//构造函数 由编译器自动调用一次 无须手动调用析构函数 //没有返回值 不用写void函数名 与类名相同 函数名前 加 ~不可以有参数 ,不可以发生重载析构函数 也是由编译器自…

一起Talk Android吧(第四百九十一回:动画集合AnimatorSetBuilder)

文章目录概念介绍功能介绍使用方法示例代码对比总结各位看官们大家好&#xff0c;上一回中咱们说的例子是"动画集AnimatorSet",这一回中咱们说的例子是" 动画集AnimatorSetBuilder"。闲话休提&#xff0c;言归正转&#xff0c;让我们一起Talk Android吧&am…

OnGUI Box 控件||Unity 3D OnGUI 常用控件

OnGUI Box 控件Unity 3D Box 控件用于在屏幕上绘制一个图形化的盒子。Box 控件中既可以显示文本内容&#xff0c;也可以绘制图片&#xff0c;或两者同时存在。GUIContent 和 GUIStyle 对于 Box 控件同样适用&#xff0c;既可以用来修饰 Box 控件的文本颜色&#xff0c;也可以用…