剑指Offer——二维数组中的查找

By AverageJoeWang
 标签:

二维数组中的查找

  • 题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数

  • 解题思路

    • 根据该二维数组的特征,即行、列有序,我们可以首先想到使用二分查找,但这里是二维数组,至少要遍历一遍数组的长度,对每一行或者每一列进行二分查找,此时的时间复杂度将近是O(nlogn),我们可以继续优化。
    • 二分查找的过程中,会产生一棵二叉判定树,二叉判定树的特点就是,左子树小于根节点,右子树大于根节点。利用这个性质,我们可以将二维数组模拟成一个二叉判定树,此时就需要找出根节点,使得左子树小于根节点,右子树大于根节点,并且它的孩子节点也符合这种特性。根据给定条件,可以看到有两个点符合要求,即左下角和右上角。
    • 以左下角来说,往上数值递减,相当于左子树,往右递增,相当于右子树。所以,我们可以定义左右两个指针,初始时指向左下角节点作为根节点,当我们需要查找的数字比当前数组节点大的时候,右指针往右移一位,当需要查找的数字小于当前节点时,左指针往上移一位。代码如下:
  • 代码实现

public class Solution {
    public boolean Find(int target, int [][] array) {
        int rows = array.length;//行
        int cols = array[0].length;//列
        int i = rows - 1;
        int j = 0;
        while (i >= 0 && j < cols) {
            if (array[i][j] < target) j++;
            else if (array[i][j] > target) i--;
            else return true;
        }
        return false;
    }
}