剑指 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。

暴力解法

把二维数组里面的数据,一个一个取出来和target进行比较

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        for(int i = 0; i < matrix.length ;i++){
			for(int j = 0; j < matrix[i].length; j++){
				if(matrix[i][j] == target){
					return true;
				}
			}
		}
		//上面没有返回true,说明没有找到
		return false;
    }
}

二叉树搜索法

[
[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]
]

观察该数组,会发现很像二叉搜索树,以18为根元素,会发现他上面的数都比他小,他右边的数字都比他大,target也是同理,如果一个数比target大,就可以从该数的右边寻找target,因为比他大的数在右边,比他小则从左边寻找。

定义 i , j ; i等于18的纵坐标,j等于18的横坐标,所以
i = matrix.length -1
j = 0
从18开始找,18如果大于target,显然target在18的上面,所以往上走,i--;
如果小于target,就往右走,所以j++
我们可以用循环
直到该数等于target时就跳出循环返回 true
直到遍历完整个二维数组,都没有找到target就返回false

代码:

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        int i = matrix.length-1;
        int j = 0;
        while(i >= 0 && j < matrix[i].length ){
            int flag = matrix[i][j];
            if(flag < target){
                j++;
            }else if(flag > target){
                i--;
            }else{
                return true;
            }
        }
        return false;
    }
}
本文仅供参考,自己学习使用

本文题目来源:力扣(LeetCode)
原创题解:点击跳转

posted @ 2022-03-28 21:48  蛇咬也不动  阅读(26)  评论(0)    收藏  举报