二维数组中的查找

简介: 二维数组中的查找

前言

本文只供自己学习做笔记留存,未经过很详细的梳理。谨慎阅读!!!

描述

在一个二维数组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≤5000≤n,m≤500 , 矩阵中的值满足 0≤val≤10^9

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

例子

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

1,[[2]] 返回 false

方法1:暴力循环,(13ms,1191kb)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param target int整型 
     * @param array int整型vector<vector<>> 
     * @return bool布尔型
     */
     //时间复杂度 O(n*n)
    bool Find(int target, vector<vector<int> >& array) {
        if(array.empty())return false; //如果为空直接返回false
        for(int row = 0;row<array.size();++row){
            auto tempele = array[row];
            if(tempele.empty())continue;
            for(const auto currval :tempele){
                if(currval == target)
                return true;
            }
        }
        return false;
        // write code here
    }
};

方法2: 二分法,(13ms,1184kb)

  1. 左闭右闭
  • while(left<=right) 为何使用<= ,因为闭区间里left==right有效
  • if(nums[middle]>target)right=middle - 1;因为第middle个值在此不等于target,所以右边界赋值时索引用midle-1。
#include <vector>
class Solution {
public:
    //二分查找
    bool search(int target,vector<int> array){
        //采用左闭右闭解法
        int left  = 0;
        int right = array.size() - 1;
        while(left<=right){
            int middle  = left +( (right - left)/2);
            if(array[middle]>target){
                right = middle - 1;
            }else if(array[middle]<target){
                left = middle +  1;
            }else{
                return true;
            }
        }
    return false;
    }
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param target int整型 
     * @param array int整型vector<vector<>> 
     * @return bool布尔型
     */
     //时间复杂度 O(n*n)
    bool Find(int target, vector<vector<int> >& array) {
        if(array.empty())return false; //如果为空直接返回false
        for(int row = 0;row<array.size();++row){
            auto tempele = array[row];
         if(search(target,tempele))return true;
        }
        return false;
        // write code here
    }
};

总结

本题的数据都是有序的,很明显可以用二分法。更深一步的学习了二分法的细节。防止混淆以后只用一种:左闭右闭的二分法。

相关文章
python用鼠标获取图像任一点的坐标和像素值
python用鼠标获取图像任一点的坐标和像素值
|
存储 负载均衡 Dubbo
深入理解Dubbo-4.Dubbo扩展SPI
深入理解Dubbo-4.Dubbo扩展SPI
236 1
|
网络协议 应用服务中间件 测试技术
Yarp 与 Nginx性能大比拼不出所料它胜利了!
Yarp 与 Nginx性能大比拼不出所料它胜利了!
348 0
jsp页面中显示word/excel文档方法
jsp页面中显示word/excel文档方法
291 0
|
数据采集 开发者
适合学校的抢球场,抢图书馆位置等公共资源软件设计思路(以中国石油大学(华东)为例)
适合学校的抢球场,抢图书馆位置等公共资源软件设计思路(以中国石油大学(华东)为例)
304 0
|
JSON 小程序 数据可视化
手把手带你开发一款云开发版点餐小程序,微信扫码点餐,用户端和后厨端都有
手把手带你开发一款云开发版点餐小程序,微信扫码点餐,用户端和后厨端都有
745 0
|
10月前
|
存储 弹性计算 运维
端到端的ECS可观测性方案,助力云上业务安全稳定
本文介绍了云原生时代保障业务系统可靠性的方法和挑战,重点探讨了阿里云ECS在提升业务稳定性、性能监控及自动化恢复方面的能力。文章分为以下几个部分:首先,阐述了业务可靠性的三个阶段(事前预防、事中处理、事后跟进);其次,分析了云上业务系统面临的困难与挑战,并提出了通过更实时的监测和自动化工具有效规避风险;接着,详细描述了ECS实例稳定性和性能问题的解决方案;然后,介绍了即将发布的ECS Lens产品,它将全面提升云上业务的洞察能力和异常感知能力;最后,通过具体案例展示了如何利用OS自动重启和公网带宽自适应调节等功能确保业务连续性。总结部分强调了ECS致力于增强性能和稳定性的目标。
|
11月前
|
存储 数据库
快速搭建南大通用GBase 8s数据库SSC共享存储集群
本文介绍如何GBase8s 数据库 在单机环境中快速部署SSC共享存储集群,涵盖准备工作、安装数据库、创建环境变量文件、准备数据存储目录、修改sqlhost、设置onconfig、搭建sds集群及集群检查等步骤,助你轻松完成集群功能验证。
|
机器学习/深度学习 人工智能 大数据
财务管理软件:自动化会计与报告的新时代
【6月更文挑战第24天】财务管理软件借助AI与自动化引领会计革命,提升效率,确保数据准确性。自动会计处理凭证、分类、编码和账务,减少错误;智能报告自定义模板,实时更新,深度分析数据。未来,AI、云计算、大数据和区块链将进一步增强软件功能,推动财务管理创新。
|
存储 安全 Android开发
安卓安全性指南:保护用户数据免受恶意攻击
【4月更文挑战第13天】本文是安卓应用安全开发指南,强调了在数字化时代保护移动设备安全的重要性,特别是针对安卓平台。开发者应理解安卓的安全架构,使用最新SDK,安全存储数据(如加密和权限管理),执行代码安全实践,应用签名,遵循安全编码标准,定期审计,及用户教育。通过这些措施,可降低应用遭受恶意攻击的风险,确保用户数据安全。
389 6