0
点赞
收藏
分享

微信扫一扫

剑指offer | 面试题4:二维数组中的查找

余寿 2022-02-05 阅读 30



转载本文章请标明作者和出处 ​​《Darwin的程序空间》​​


剑指offer | 面试题4:二维数组中的查找_java

开始行动,你已经成功一半了,献给正在奋斗的我们


题目

在一个 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



解题分析

这道题最简单的做法,就是暴力遍历法,遍历整个二位数组的元素,然后找到目标值并且返回,这样的时间复杂度为O(m*n);且没有用到二维数组每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序的条件;

我们首先想到的就是可能从左上角的元素开始遍历,这样做有一个最大的问题,如果当前的元素比目标元素要小,那么就有两种走法,你往下走也会变大,往右走也会变大,这样就有两个选择,就迫使你随机选择一个,如果选错了,回头就很难了;

但是如果我们换一个思路,从右上角或者左下角开始走的话,情景将会发生很大的转变;右上角已经是最大的列了,如果目标值还比当前元素大只有往下走一条路,如果比当前元素小,你也只有往左走一条路,从左下角开始也同理,直到找出界,那么就是不存在目标整数,这样的时间复杂度为O(m+n);

  • 题外话
    这道题其实也蕴含了一个哲理,选一条对的路,一直走的头就是答案,给自己太多的选择,终究会找不到回去的路;

代码

ps:这里笔者使用的jdk为1.8、python3.7


  • java实现(从右上角开始)
    ​class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if (Objects.isNull(matrix) || matrix.length == 0 || matrix[0].length == 0) { return false; } int line = 0; int row = matrix[0].length - 1; while (true) { if (row < 0 || line >= matrix.length ) { return false; } else if (matrix[line][row] == target) { return true; } else if (matrix[line][row] > target) { row--; } else { line++; } } } } ​
  • python实现(从左下角开始)
    ​class Solution: def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool: if matrix is None or len(matrix) == 0 or len(matrix[0]) == 0: return False line, row = len(matrix) - 1, 0 while True: if line < 0 or row > len(matrix[0]) - 1: return False elif matrix[line][row] == target: return True elif matrix[line][row] > target: line -= 1 else: row += 1 ​

剑指offer | 面试题4:二维数组中的查找_二维数组_02


剑指offer | 面试题4:二维数组中的查找_2d_03


举报

相关推荐

0 条评论