剑指 Offer 之数组与矩阵04. 二维数组中的查找->简单易入手,建议码友们点赞+收藏喔~

一、题目描述

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

示例 1:
现有矩阵如下:

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

二、题目解析

注意题目描述:

仔细观察矩阵,可以发现:左下角元素为所在列最大元素,所在行最小元素
如果 左下角元素 大于了目标值,则目标值一定在该行的上方, 左下角元素 所在行可以消去。
如果 左下角元素 小于了目标值,则目标值一定在该列的右方, 左下角元素 所在列可以消去。
具体操作为从矩阵左下角元素开始遍历,并与目标值对比:

  • 当 matrix[i][j] > target 时: 行索引向上移动一格(即 i–),即消去矩阵第 i 行元素;
  • 当 matrix[i][j] < target 时: 列索引向右移动一格(即 j++),即消去矩阵第 j 列元素;
  • 当 matrix[i][j] == target 时: 返回 true。

如果越界,则返回 false。

三、参考代码

public class findArray {
    public static void main(String[] args) {
        int [][] 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}
        };
        int target = 11;
        System.out.println(findNumberArray(matrix, target));
    }
    public static boolean findNumberArray(int[][] matrix, int target) {

        // 从数组的最左下角位置开始去搜索整个二维数组
        // 1、当发现当前遍历的元素大于 target 时,意味着这个元素后面的所有元素也都大于 target
        // 那么就不用去搜索这一行了
        // 2、当发现当前遍历的元素小于 target 时,意味着这个元素上面的所有元素也都小于 target
        // 那么就不用去搜索这一列了

        // 初始化 i 和 j 为数组左下角元素
        // 最后一行
        int i = matrix.length - 1;

        // 第 0 列
        int j = 0;


        // 从数组的左下角开始出发,只要 i 和 j 没有越界继续判断
        while(i >= 0 && j < matrix[0].length){

            // 当发现当前遍历的元素大于 target 时,意味着这个元素后面的所有元素也都大于 target
            if(matrix[i][j] > target){

                // 行索引向上移动一格(即 i-- ),即消去矩阵第 i 行元素
                i--;

                // 当发现当前遍历的元素小于 target 时,意味着这个元素上面的所有元素也都小于 target
            }else if(matrix[i][j] < target){

                //列索引向右移动一格(即 j++ ),即消去矩阵第 j 列元素
                j++;

                // 否则,说明找到目标值
            }else{

                // 直接返回 ture
                return true;
            }
        }

        // 遍历了整个二维数组,没有找到目标值,返回 false
        return false;
    }
}



运行结果:

如果目标值在矩阵中存在则返回true,返回则false。

运行结果

算法是程序员最核心的部分,望家人们要同我一起坚持每日一练哝~

作者:Aimee.洁
本文版权归作者和CSDN共有,欢迎转载,未经作者同意必须保留此版声明,否则保留追究法律责任的权利。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值