链接: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)

最新文章

  1. Cocos2dx
  2. java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)可能出现的原因
  3. border单样式写法的问题
  4. spark streaming 实现接收网络传输数据进行WordCount功能
  5. 以静态变量保存 Spring ApplicationContext
  6. java 词法分析器
  7. cogs 1008 贪婪大陆
  8. Dungeon Game 解答
  9. vue 高德地图之玩转周边
  10. (0)HomeAssistant 教程
  11. ES6中const、let与var的对比详解
  12. Python记录13:软件开发目录规范
  13. 目标检测-yolo
  14. 阿里云mysql远程登录报ERROR 2027(HY000)
  15. Linux下安装uci
  16. 五校联考R1 Day2T2 矩阵matrix(容斥)
  17. 模型标准化——预测模型标记语言(PMML)
  18. Python 文件操作一
  19. C# 队列(Queue) 和堆栈(Stack)
  20. 【BZOJ2527】[Poi2011]Meteors 整体二分

热门文章

  1. Windows核心编程 第2 5章 未处理异常和C ++异常(上)
  2. 《前端运维》一、Linux基础--基础命令(1)
  3. jpa模糊查询(表中的某些数据)
  4. 【前端】使用layui、layer父子frame传值
  5. es6.4.0安装和配置IK+拼音插件 实现非全拼搜索
  6. 面试遇到的坑JS深拷贝和浅拷贝
  7. NumPy之:ndarray中的函数
  8. ES系列(五):获取单条数据get处理过程实现
  9. welcome实现首页路由的重定向效果
  10. [Java] SpringBoot