33--二维数组中的查找

1.问题描述

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

示例: 现有矩阵 matrix 如下:

[ [1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]]

给定 target = 5,返回 true。
给定 target = 20,返回 false。

2.解题思路

方法一:暴力求解

如果不考虑二维数组排好序的特点,则直接遍历整个二维数组的每一个元素,判断目标值是否在二维数组中存在。

依次遍历二维数组的每一行和每一列。如果找到一个元素等于目标值,则返回 true。如果遍历完毕仍未找到等于目标值的元素,则返回 false。

时间复杂度:O(nm)O(nm)。二维数组中的每个元素都被遍历,因此时间复杂度为二维数组的大小。

空间复杂度:O(1)O(1)。

class Solution {public boolean findNumberIn2DArray(int[][] matrix, int target) {if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {return false;}int rows = matrix.length, columns = matrix[0].length;for (int i = 0; i < rows; i++) {for (int j = 0; j < columns; j++) {if (matrix[i][j] == target) {return true;}}}return false;}
}

方法二:线性查找
由于给定的二维数组具备每行从左到右递增以及每列从上到下递增的特点,当访问到一个元素时,可以排除数组中的部分元素。

从二维数组的右上角开始查找。如果当前元素等于目标值,则返回 true。如果当前元素大于目标值,则移到左边一列。如果当前元素小于目标值,则移到下边一行。

可以证明这种方法不会错过目标值。如果当前元素大于目标值,说明当前元素的下边的所有元素都一定大于目标值,因此往下查找不可能找到目标值,往左查找可能找到目标值。如果当前元素小于目标值,说明当前元素的左边的所有元素都一定小于目标值,因此往左查找不可能找到目标值,往下查找可能找到目标值。

1.若数组为空,返回 false
2.初始化行下标为 0,列下标为二维数组的列数减 1
3.重复下列步骤,直到行下标或列下标超出边界
获得当前下标位置的元素 num
如果 num 和 target 相等,返回 true
如果 num 大于 target,列下标减 1
如果 num 小于 target,行下标加 1
4.循环体执行完毕仍未找到元素等于 target ,说明不存在这样的元素,返回 false

时间复杂度:O(n+m)O(n+m)。访问到的下标的行最多增加 n 次,列最多减少 m 次,因此循环体最多执行 n + m 次。

空间复杂度:O(1)O(1)。

class Solution {public boolean findNumberIn2DArray(int[][] matrix, int target) {if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {return false;}int rows = matrix.length, columns = matrix[0].length;int row = 0, column = columns - 1;while (row < rows && column >= 0) {int num = matrix[row][column];if (num == target) {return true;} else if (num > target) {column--;} else {row++;}}return false;}
}

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

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

相关文章

XML Schema是什么

XML Schema 本身也是一种XML构造&#xff0c;它用来描述[哪个元素&#xff0c;在什么时候出现]&#xff0c;[该元素具有什么样的属性]等等&#xff0c;也就是说&#xff0c;XML Schema是对XML的树形构造加以描述说明的一种语言。原本&#xff0c;使用DTD对XML的树形构造加以描述…

js之base64上传图片

首先要搭建好springmvc&#xff0c;详见https://www.cnblogs.com/zzb-yp/p/9295397.html 整体思路&#xff1a;前端代码包括显示和传参&#xff08;这里的参数主要就是图片的base64字符串&#xff09;&#xff0c;显示主体部分是type“file”类型的input组件和一个提交按钮 …

一些常用软件的网络端口协议分类介绍

最近有朋友请教我有关实现校园局域网视频功能软件的编写问题&#xff0c;涉及到端口有关的知识&#xff0c;自己查了一些资料&#xff0c;发现这篇文章总结得比较不错&#xff0c;常用软件涵盖得比较丰富&#xff0c;很实用&#xff0c;需要用到的时候可以查阅。于是决定将这篇…

WPF 使用皮肤影响按钮自定义

在WPF项目中使用了 Theme的皮肤后&#xff0c;发现自定义的按钮全部都是 皮肤里面的样式&#xff0c;如下图&#xff1a; 要自定义样式&#xff0c;只有不给按钮使用皮肤样式。 如果想给某一个控件使用样式&#xff0c;在前端Xaml的控件中&#xff0c;设置一下属性即可&#xf…

各种数据库对应的jar包、驱动类名和URL格式

见&#xff1a;http://blog.csdn.net/xuguiyi100/article/details/7970379 maven/Java/web/bootstrapQQ群&#xff1a;566862629。希望更多人一起帮助我学习。 1.1. 各种数据库对应的jar包 具体如下&#xff1a; 数据库类型 对应的Jar文件 Oracle 8i classes12.zip 或…

34--替换空格

1.问题描述 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。 示例 1&#xff1a; 输入&#xff1a;s “We are happy.” 输出&#xff1a;“We%20are%20happy.” 2.解题思路 由于每次替换从 1 个字符变成 3 个字符&#xff0c;使用字符数组可方…

HTML的xmlns的作用

作用&#xff1a;由于xml允许定义自己的标记&#xff0c;但你定义的标记和其他人定义的标记有可能相同&#xff0c;但表示不同的含义。当文档交换或者共享的时候就容易产生错误。为避免这种错误产生&#xff0c;xml采用名字空间声明&#xff0c;允许你通过一个网址来识别你的标…

树链剖分 讲解+模板+习题

今天我们来讲一下树链剖分 树链剖分是什么&#xff1f; 树链剖分是一种用来维护树上路径信息的在线方法&#xff0c;可以处理在线。 通常通过一种方法&#xff0c;将一棵树剖分成若干条链&#xff0c;然后通过数据结构&#xff08;线段树&#xff0c;BIT等&#xff09;去维护。…

navicat 批量插入 测试数据

1. 前言 遇到线上大sql执行较慢, 10s, 做优化改进时&#xff0c;首先想到的是在本地造出一个类似的库环境&#xff0c;先本地实验。 然后往表中创建大量数据... 2. 方案 利用mysql函数来插入大量数据 代码 BEGIN#Routine body goes here... DECLARE id int; DECLARE driverid …

互联网产品用户体验设计的三大定律

好友发过来一PPT&#xff0c;文件名是互联网产品的体验设计&#xff0c;认真看完&#xff0c;收获颇多&#xff0c;其中印象最深刻的是用户体验可用性的三大定律&#xff0c;正好FasterSoft正在打造互联网精品平台iWorld&#xff0c;最需要的时候好东西就上门来了&#xff0c;这…

oracle 对应的JDBC驱动 版本

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Oracle版本jdk版本推荐jar包备注Oracle 8iJDK 1.1.xclasses111.zip Oracle 8iJDK 1.1.xclasses12.zip Oracle 9iJDK 1.1.xclasses111.ja…

JSP特点

1.JSP文件必须在JSP服务器内运行。 2.JSP文件必须生成servlet才能执行。 3.JSP页面的第一个访问者速度慢&#xff0c;因为需要编译生成Servlet。 4.JSP不需要专门的客户端&#xff0c;也不需要java运行环境&#xff0c;因为JSP输出到页面是标准的HTML文件。

35--用两个栈实现队列

1.问题描述 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead 操作返回 -1 ) 示例 1&#xff1a; 输入&#xf…

如何open一个新tab页面

打开新tab页的两种方式 1 a标签 function openwin(url) {var a document.createElement("a");a.setAttribute("href", url);a.setAttribute("target", "_blank");a.setAttribute("id", "camnpr");document.body.…

Linux中打开文件管理器的命令

在Mac中&#xff0c;我们可以使用open命令&#xff0c;在终端打开指定目录下的文件管理器&#xff0c;在Linux中&#xff0c;同样可以使用类似的命令&#xff1a;nautilus。 转载于:https://www.cnblogs.com/chaoguo1234/p/9446106.html

final类与方法

final类---不可被继承。 final方法---不可被覆盖。

【Visual C++】一些开发心得与调试技巧

自己平时收集的一些技巧与心得&#xff0c;这里分享出来&#xff0c;普及一下知识。 1.如何在Release状态下进行调试   Project->Setting>ProjectSetting对话框&#xff0c;选择Release状态。C/C标签中的Category选General&#xff0c;Optimizations选Disable(Debug)&a…

36--斐波那契数列

1. 问题描述 写一个函数&#xff0c;输入n&#xff0c;求斐波那契&#xff08;Fibonacci&#xff09;数列的第 n 项。斐波那契数列的定义如下&#xff1a; F(0) 0, F(1) 1 F(N) F(N - 1) F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始&#xff0c;之后的斐波那契数…

lineNumber: 1; columnNumber: 1; 前言中不允许有内容

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我是在xml配置文件中引用别的配置文件&#xff0c;本来是这样写的 <import resource"spring-mybatis.xml" /> 就报这…

idea输入法候选区不跟随光标

环境&#xff1a; win10 idea 2017.04 搜狗8.6 问题&#xff1a; idea编辑区输入法候选区不跟随光标 解决&#xff1a; 输入法改成必应输入法 不行的话不用你动手 我自砸蛋蛋。&#xff08;保命狗头。。&#xff09; 转载于:https://www.cnblogs.com/yadongliang/p/9079367.htm…