当前位置: 首页 > article >正文

牛客 BM18 二维数组中的查找

在一个二维数组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 ≤ 10^9
进阶:空间复杂度 O(1) ,时间复杂度 O(n+m)

示例1

输入:

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

返回值:

true

说明:

存在7,返回true   

示例2

输入:

1,[[2]]

返回值:

false

示例3

输入:

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

返回值:

false

说明:

不存在3,返回false   

解法一:暴力硬上

直接双重 for 循环,遍历数组,找到是否存在。可以简单优化,因为是向右下的递增,所以遇到大于 target 的就可以跳出该层循环;或者加个二分查找之类的。

for (i : 0 - n ) {
    for (j : 0 - m ) {
        if (nums[i][j] == target) {
            return true;
    }
}
return false;

解法二:分治(从题解看到的算法美学)

出发点:因为数组从左往右递增,从上往下递增,所以左下角的数字大于左上的数字,小于右下的数字。

解法:

1、获取数组边长,判断特殊情况

2、从左下角 A 出发,如果 A 大于 target,那么向上移动,如果 A 小于 target,向右移动

3、遇到边界仍未找到 target,说明数组不存在 target

示例:

1289target=7
24912
471013
681115

首先获取左下角,A=6,A<target,所以 A 向右移动。这里需要注意,因为矩阵的递增性质,所以 A 这一列全都无法再次访问,因为他们都比 target 小。

1289target=7
24912
471013
681115

获取 A=8,A>target,所以 A 向上移动。同理得 A=8 这一行全都失效,因为他们都比 target 大。

1289target=7
24912
471013
681115

获得 A=7=target,结束方法。

        int height = array.length;
        int width = array[0].length;
        int xPos = 0;
        int yPos = height - 1;
        while (yPos >= 0 && xPos < width) {
            if (array[yPos][xPos] == target) {
                return true;
            } else if (array[yPos][xPos] > target) {
                yPos--;
            } else if (array[yPos][xPos] < target) {
                xPos++;
            }
        }
        return false;

还可优化,例如左下右上同时缩进等。


http://www.kler.cn/a/17924.html

相关文章:

  • 宗馥莉的接班挑战:内斗升级,竞品“偷家”
  • 基于 Python Django 的二手房间可视化系统分析
  • 【FFmpeg】FFmpeg 函数简介 ③ ( 编解码相关函数 | FFmpeg 源码地址 | FFmpeg 解码器相关 结构体 和 函数 )
  • PyTorch深度学习与企业级项目实战-预训练语言模型GPT
  • 信号-3-信号处理
  • 使用 Keras 训练一个卷积神经网络(CNN)(入门篇)
  • c# 数据保存为PDF(二) (Aspose pdf篇)
  • Linux C/C++后台开发面试重点知识
  • 互联网摸鱼日报(2023-05-08)
  • 虚拟环境中的 CPU 优化
  • YAPI--撰写接口文档的平台
  • ruby环境中的irb
  • 奇数单增序列
  • 有限等待忙等、让权等待死等、互斥遵循的几大原则——参考《天勤操作系统》,柳婼的博客
  • 基于C#开发 B/S架构的实验室管理系统 云LIS系统(MVC + SQLserver + Redis)
  • HTTP的特点
  • Python入门(三)变量和简单数据类型(二)
  • MySQL基础(十四)视图
  • 设计模式——模板方法模式
  • 数据结构与算法基础(王卓)(35):交换排序之快排【第二阶段:标准答案、初步发现问题】
  • 看不懂具体的代码方法?这样向chatgpt提问
  • (22)目标检测算法之 yolov8模型导出总结
  • Scala Option类型,异常处理,IO,高阶函数
  • Ceph入门到精通-OSD 故障排除
  • TCP/IP相关面试题
  • 什么是数据库中的流程控制