![56e799f8b28f322acf335aee4b9d1b63.png](https://i-blog.csdnimg.cn/blog_migrate/756d472575cc43d52d6622caedabf519.jpeg)
今天分享的题目来源于 LeetCode 上的剑指 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
二、题目解析
仔细观察矩阵,可以发现:左下角元素 为所在列最大元素,所在行最小元素
如果 左下角元素 大于了目标值,则目标值一定在该行的上方, 左下角元素 所在行可以消去。
如果 左下角元素 小于了目标值,则目标值一定在该列的右方, 左下角元素 所在列可以消去。
具体操作为从矩阵左下角元素开始遍历,并与目标值对比:
- 当
matrix[i][j] > target
时: 行索引向上移动一格(即i--
),即消去矩阵第i
行元素; - 当
matrix[i][j] < target
时: 列索引向右移动一格(即j++
),即消去矩阵第j
列元素; - 当
matrix[i][j] == target
时: 返回 true。 - 如果越界,则返回 false。
三、动画描述
![984f8567dd38cdd262586fc016f9d927.png](https://i-blog.csdnimg.cn/blog_migrate/faa2e21ffa62e88dc791877b23c5dd29.png)
四、图片描述
![7f2d73d42c4b1b767560ee5c2dc8f307.png](https://i-blog.csdnimg.cn/blog_migrate/56bd6a380d1de4fa74c05b51ee8ec279.png)
![a32bd2afb62aedced485a82e840bb0c8.png](https://i-blog.csdnimg.cn/blog_migrate/b8d6e13d19cae8663cf10b3d90a22961.jpeg)
![8fea049ee00b2e19a0f813a2412b309d.png](https://i-blog.csdnimg.cn/blog_migrate/325f7f5d60605e88cb5c47e0c8c767f9.jpeg)
![ba667dd32cdd4c5a9d2a4fa42535dc00.png](https://i-blog.csdnimg.cn/blog_migrate/1bc17d674d9a7987aeade44e12315819.jpeg)
![6bd8b031549272d59c5e1a24f2894ab1.png](https://i-blog.csdnimg.cn/blog_migrate/fcd4bf036a7c95ee5dfde983057e0610.jpeg)
![610dedf60231005d50c9453e684557ec.png](https://i-blog.csdnimg.cn/blog_migrate/2b872f616a5469a29b17165c18a81218.jpeg)
![75a48207fe8926314b59dda0a53fde75.png](https://i-blog.csdnimg.cn/blog_migrate/8b28ca62ca9001b1cb4899964b385a3c.jpeg)
![b72233a93e844f623fc5f7bc4e52ad27.png](https://i-blog.csdnimg.cn/blog_migrate/1432f8b3600c32aac06607fc2c22d4f7.jpeg)
![4f1f92ebb93048b08301b1af539084c1.png](https://i-blog.csdnimg.cn/blog_migrate/8e36a600d3a9cfa0e6c370d6cbef0a83.jpeg)
![cd04de60009bb203307e57f7bb31ec39.png](https://i-blog.csdnimg.cn/blog_migrate/69ac64b4077f5d3201dbece199028b16.jpeg)
![a237701388b720e125c4da500344d994.png](https://i-blog.csdnimg.cn/blog_migrate/16aa5d417548791a6b8c651c99884c37.jpeg)
![56a0849ac58952daea69d589d6551b4d.png](https://i-blog.csdnimg.cn/blog_migrate/9a1ed51724786ab4629a80f5f814e0db.jpeg)
![21277f72595156bb989e910aff38584c.png](https://i-blog.csdnimg.cn/blog_migrate/64324026387c6538a9f34a98745f70e1.png)
![3adb3397f1b0533c2b5bd2ed1bda3267.png](https://i-blog.csdnimg.cn/blog_migrate/cc723d7f2ec415d43c631073c85e8e59.jpeg)
![136a715a65bddf12b89b888be9ec4277.png](https://i-blog.csdnimg.cn/blog_migrate/01a0db27d56ff9b0e39d90eeeab3f95f.jpeg)
![b03f105d3af40e4ba99b2c2c9451fc1b.png](https://i-blog.csdnimg.cn/blog_migrate/a387a1aaf8bd449deb45599cb40eb7e2.png)
![8416a9ccb6932ec3328a1f155c00ec27.png](https://i-blog.csdnimg.cn/blog_migrate/943c6b288ad3c9cfc65a7d2f2157b5db.png)
![7c4d4a470eb69b97995da32ff831ce43.png](https://i-blog.csdnimg.cn/blog_migrate/591f3ea8d40d6c320b216d692820a77a.jpeg)
![9f11a376d7fb4e4a737d2176869a17cd.png](https://i-blog.csdnimg.cn/blog_migrate/3774633dab918aaa9fe4e113f2336d4f.jpeg)
五、参考代码
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
//初始化 i 和 j 为数组左下角元素
int i = matrix.length - 1,
int j = 0;
//如果 i 和 j 没有越界继续判断
while(i >= 0 && j < matrix[0].length){
if(matrix[i][j] > target){
//行索引向上移动一格(即 i-- ),即消去矩阵第 i 行元素
i--;
}else if(matrix[i][j] < target){
//列索引向右移动一格(即 j++ ),即消去矩阵第 j 列元素
j++;
}else{
//找到目标值,直接返回 ture
return true;
}
}
//没有找到目标值,返回 false
return false;
}
}
六、复杂度分析
时间复杂度
时间复杂度为 O(M+N),其中,N 和 M 分别为矩阵行数和列数,此算法最多循环 M + N 次。
空间复杂度
空间复杂度为 O(1)。
七、相关标签
- 数组
- 双指针
- 二分法
如果你对学算法感兴趣的话,可以查看简介一起交流学习算法:)
我的专栏:
和程序员小吴一起学算法zhuanlan.zhihu.com![f76b3739d2a5f85399550b7506306f80.png](https://i-blog.csdnimg.cn/blog_migrate/91ce2bd9a794430176cf44d55c745f32.jpeg)
我的其它相关回答:
程序员必须掌握哪些算法?www.zhihu.com![2b22a2857631477c5ac35320a1e946db.png](https://i-blog.csdnimg.cn/blog_migrate/8b6620a635abbdcf8692267c44b55ad6.jpeg)
![a37a2f6985a1cc1282e06b1e8aa52f84.png](https://i-blog.csdnimg.cn/blog_migrate/df77ae5249190e7dc39da2b759ff180b.jpeg)
![0cde64aa819df354c15ff304e0e06022.png](https://i-blog.csdnimg.cn/blog_migrate/7cf621359bde706b8a095de27a263241.jpeg)
![429bde09fd9c76bb64c6a1aabe673843.png](https://i-blog.csdnimg.cn/blog_migrate/871d3163a6b0ea71bf0c07f88117209c.jpeg)