剑指Offer 04. 二维数组中的查找-【算法基础】

微信公众号同步更新

欢迎和小白一起成长,985计算机硕士,有任何学习保研等问题都可以公众号私信留言哦!

微信搜索:三喂树屋

剑指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 = 8,返回 true。

给定 target = 20,返回 false。

思路

先看一下矩阵的规律,仔细观察矩阵,可以发现:左下角元素为所在列最大元素,所在行最小元素;右上角元素为所在行最大元素,所在列最小元素。依照此规律,可以有如下查找思路

选择矩阵最左下角的元素为初始元素(你也可以选择右上角的元素为起始元素,逻辑类似),如果 左下角元素大于了目标值,则目标值一定在该行的上方, 此时我们向上一行查找;如果左下角元素小于了目标值,则目标值一定在该列的右方, 此时我们向后一列查找。

代码实现

/**
 * @author:三喂树屋
 * @2022/3/26 15:33
 * 文件信息:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,
 * 每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组
 * 和一个整数,判断数组中是否含有该整数。
 */
public class findNumberIn2DArray {
    public static boolean solution(int[][]matrix,int target){
        int i = matrix.length-1;
        int m = matrix[0].length;
        int j = 0;
        while (i>=0&&j<m){//从左下角元素开始查找
            if (matrix[i][j]>target){//左下角元素较大,则目标元素必然在i上面的某一行(如果存在
                i--;
            }else if (matrix[i][j]<target){//左下角元素较小,则目标元素必然在j右面的某一列(如果存在
                j++;
            }else {//目标元素找到
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        int[][] matrix = new int[][]{{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}
        };
        System.out.println(solution(matrix,28));

    }
}

图解过程

1. 目标值target=5,起始位置为左下角的元素18

第一步

2. 18和5比较,大于5,则执行i–,向上移动一行

第二步

3. 10和5比较,大于5,则执行i–,向上移动一行

第三步

4. 3和5比较,小于5,则执行j++,向右移动一列

第四步

5. 6和5比较,大于5,则执行i–,向上移动一行

第五步
至此,查找结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三喂树屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值