剑指 Offer 04. 二维数组中的查找
链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/
标签:数组、双指针、二分
题目
在一个 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。
0 <= n <= 1000
0 <= m <= 1000
分析
题目给定了一个二维数组,该数组的特点是每一行从左往右递增,每一列从上往下递增,并且要你设计一个高效的函数。那本意肯定不是让你直接二重循环去查找。
解法一:这时候就应该想到是用二分法去解决这道题目。我的思路是,循环列,对于每一行,先判断该数是否在该行的范围内,如果在,那么再使用二分查找在该行内查找这个数,查到了就返回,没查到就继续下一行。
解法二:仔细观察二维数组,可以发现,左下角和右上角连起来的对角线,把整个二维数组分成了两份,左上角的三角形是小于对角线的,右下角的三角形是大于对角线的。基于此,可以从右上角的数开始,遍历,如果target大于当前的数,则col–往左移动一列;如果target小于当前的数,则row++往下移动一行。
编码
解法一:
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
int m = matrix.length;
for (int i = 0; i < m; i++) {
int n = matrix[i].length;
if (n <= 0 || target < matrix[i][0] || target > matrix[i][n - 1]) {
continue;
}
int left = 0, right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (matrix[i][mid] == target) {
return true;
} else if (matrix[i][mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return false;
}
}

时间复杂度O(mlogn),空间复杂度O(1)
解法2:
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if (matrix.length == 0 || matrix[0].length == 0) {
return false;
}
int m = 0, n = matrix[0].length - 1;
while (m < matrix.length && n >= 0) {
if (target > matrix[m][n]) {
m++;
} else if (target < matrix[m][n]) {
n--;
} else {
return true;
}
}
return false;
}
}

时间复杂度O(m + n),空间复杂度O(1)
剑指 Offer 04. 二维数组中的查找的更多相关文章
- 剑指 Offer 04. 二维数组中的查找 (思维)
剑指 Offer 04. 二维数组中的查找 题目链接 本题的解法是从矩阵的右上角开始寻找目标值. 根据矩阵的元素分布特性, 当目标值大于当前位置的值时将row行号++,因为此时目标值一定位于当前行的下 ...
- 【LeetCode】剑指 Offer 04. 二维数组中的查找
二维数组查找:线性查找法 有二维数组: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, ...
- 剑指offer——04二维数组中的查找
题目: 数组中唯一只出现一次的数字.在一个数组中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 题解: 如果一个数字出现三次,那么它的二进制表示的每一位(0或者1)也出现 ...
- 剑指offer:二维数组中的查找
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺 ...
- 《剑指offer》 二维数组中的查找
本题目是<剑指offer>中的题目 二维数组中的查找 题目: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...
- 【Java】 剑指offer(3) 二维数组中的查找
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上 ...
- [剑指Offer]5.二维数组中的查找
题目 在一个二维数组中,每一行都依照从左到右递增的顺序排序,每一列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个二维数组和一个整数.推断数组中是否含有该整数. 思路 [算法系列之三十三]杨 ...
- 《剑指Offer 1.二维数组中的查找》2019-03-25
剑指Offer 第一题 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数 ...
- Go语言实现:【剑指offer】二维数组中的查找
该题目来源于牛客网<剑指offer>专题. 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一 ...
随机推荐
- UVA11992不错的线段树段更新
题意: 给你一个矩阵,最大20*50000的,然后有三个操作 1 x1 y1 x2 y2 v 把子矩阵的值全部都加上v 2 x1 y1 x2 y2 v 把子矩阵的值全部都变成v 2 x ...
- vue中v-if与v-show的区别以及使用场景
区别 1.手段:v-if是通过控制dom节点的存在与否来控制元素的显隐:v-show是通过设置DOM元素的display样式,block为显示,none为隐藏: 2.编译过程:v-if切换有一个局部编 ...
- Educational Codeforces Round 101 (Rated for Div. 2)
A. Regular Bracket Sequence 题意:题目中给(和)还有?,其中?可以转换成为()中的任何一个,并且所给样例中只出现一次(),问能不能括号匹配 思路:直接看第一个和最后一个能不 ...
- OO_Unit3_JML规格模式
---恢复内容开始--- [CSDN博客链接](https://blog.csdn.net/weixin_43387647/article/details/90451173) @[toc] ## 一. ...
- 【BUAA软工】结对编程作业
项目 内容 课程:2020春季软件工程课程博客作业(罗杰,任健) 博客园班级链接 作业:BUAA软件工程结对编程项目作业 作业要求 课程目标 学习大规模软件开发的技巧与方法,锻炼开发能力 作业目标 完 ...
- [并发编程 - 多线程:信号量、死锁与递归锁、时间Event、定时器Timer、线程队列、GIL锁]
[并发编程 - 多线程:信号量.死锁与递归锁.时间Event.定时器Timer.线程队列.GIL锁] 信号量 信号量Semaphore:管理一个内置的计数器 每当调用acquire()时内置计数器-1 ...
- pt-online-schema-change 大数据表结构修改
使用场景: 在线修改大数据量表结构(ALTER tables without locking them) 文档参考:https://www.percona.com/doc/percona-toolki ...
- xxl-job源码阅读二(服务端)
1.源码入口 xxl-job-admin是一个简单的springboot工程,简单翻看源码,可以很快发现XxlJobAdminConfig入口. @Override public void after ...
- prometheus nginx-module-vts删除内存区数据
项目地址:https://github.com/vozlt/nginx-module-vts 删除所zone内存中的数据 curl localhost/status/control?cmd=delet ...
- [Python] Flask从0到1开发轻量级网页
概述 Flask采用MVT模型,即Model, Template, View Model:定义数据的存储格式,并且提供了数据库访问的API View:定义那些数据被显示,是业务逻辑处理模块 Templ ...