【剑指 Offer 题解】二维数组中的查找

题目描述

给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。

Consider the following 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]
]

Given target = 5, return true.
Given target = 20, return false.Copy to clipboardErrorCopied

解题思路

要求时间复杂度 O(M + N),空间复杂度 O(1)。其中 M 为行数,N 为 列数。
解题思路于它的数一定在其下边。因此,从右上角开始查找,就可以根据 target 和当前元素的大小关系来缩小查找区间,当前元素的查找区间为左下角的所有元素。

img

代码

跟着断点走一遍思路非常清晰

package com.janeroad;

/**
 * Created on 2020/4/27.
 *
 * @author LJN
 */

//给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。

public class test1 {
    public boolean find(int target,int [][]arr){
        if(arr==null||arr.length<=1||arr[0].length<=1)
            return false;
        int j=0,k=arr[0].length-1;
        while (j<arr.length&&k>=0){
            if(target==arr[j][k])
                return true;
            else if(target>arr[j][k])
                j++;
            else
                k--;
        }
        return false;
    }

    public static void main(String[] args) {
        int [][] arr=new int[][]{{1,4,7,11,15},{2,5,8,12,19},{3,6,9,16,12},{10,13,14,17,24},{18,21,23,26,30}};
        test1 test1=new test1();
        System.out.println(test1.find(5,arr));
        System.out.println(test1.find(10,arr));
        System.out.println(test1.find(27,arr));
    }
}

解题思路和图片来源:https://cyc2018.github.io/CS-Notes/#/notes/4.%20%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84%E4%B8%AD%E7%9A%84%E6%9F%A5%E6%89%BE

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×