程序员社区

剑指Offer系列(java版,详细解析)04.二维数组中的查找

题目描述

剑指 Offer 04. 二维数组中的查找

难度中等

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

**注意:**本题与主站 240 题相同:https://leetcode-cn.com/problems/search-a-2d-matrix-ii/

测试用例

  • 二维数组中包含查找的数字(查找的数字是数组中的最大值和最小值;查找的数字介于数组中的最大值和最小值之间)
  • 二维数组中没有查找的数字(查找的数字大于数组中的最大值;查找的数字小于数组中的最小值,查找的数字在数组的最大值与最小值之间但数组汇总没有这个数字)
  • 特殊输入测试(输入数组一维长度或者二维长度为0)

题目考点

  • 考察应聘者对二维数组的理解及编程能力。二维数组在内存中占据连续的空间。
  • 考察应聘者分析问题的能力。当应聘者发现问题比较复杂时,能不能 通过具体的例子找出其中的规律,是能否解决这个问题的关键。

解题思路

首先选取数组中右上角(左下角也可以)的数字,如果该数字等于要查找的数字,那么查找过程结束;如果该数字大于要查找的数字,则剔除这个数字所在的列,因为它所在的列的所有值都比要查找的数字大;如果该数字小于要查找的数字,则剔除这个数字所在的行,因为它所在的列的所有值都比要查找的数字小;也就是说,如果查找的数字不在数组(新查找范围)的右上角,则每次都能剔除一行或者一列,每次都可以缩小查找的范围,直到找到要查找的数字,或者查找不到。

解题

class Solution {
   
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
   
        if(matrix.length==0)
        return false;
        int i=0,j = matrix[0].length-1;
        while(j>=0 && i<=matrix.length-1){
   
            int now = matrix[i][j];
            if(now==target)
                return true;
            if(now>target)
                j--;
            else
                i++;
        }
        return false;
    }
}
赞(0) 打赏
未经允许不得转载:IDEA激活码 » 剑指Offer系列(java版,详细解析)04.二维数组中的查找

一个分享Java & Python知识的社区