【Leetcode】Offer04. 二维数组中的查找(保姆级代码注释)

4 篇文章 0 订阅

image.png

  • 自己的方法,小白最先想到的循环对比值
/**
 * 剑指 Offer 04. 二维数组中的查找
 * 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
 *
 * @author 陈賝
 * @version 1.0
 * @date 2022/6/29 14:31
 */
public class offer04 {

    /**
     * TODO
     *
     * @param matrix 目标矩阵
     * @param target 目标值
     * @return boolean
     * @author 陈賝
     * @date 2022/7/5 10:43
     */
    public static boolean findNumberIn2DArray(int[][] matrix, int target) {
        // 若矩阵为空直接返回false,防止下面越界
        if (matrix.length == 0 || matrix[0].length == 0) return false;

        // 行边界,列边界
        int row = matrix.length - 1, col = matrix[0].length - 1;

        // (从右上角出发)当前行指针=0,列指针=右边界
        int rowCurrent = 0, colCurrent = col;

        /**
         * 当前值不等于目标值则循环查找,越界则直接返回false,找到返回true
         */
        while (matrix[rowCurrent][colCurrent] != target) {
            // 当前值
            int value = matrix[rowCurrent][colCurrent];
            /**
             * 当前值大于目标值则想左走一步
             */
            if (value > target && colCurrent > 0) {
                colCurrent--;
            }
            /**
             * 当前值大于目标值则向右走一步
             */
            else if (value < target && rowCurrent < row) {
                rowCurrent++;
            }
            /**
             * 若越界则返回false
             */
            else return value == target;
        }
        return true;
    }

    /**
     * IDE运行 
     */
    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}
        };
        matrix = new int[0][0];
        boolean numberIn2DArray = findNumberIn2DArray(matrix, 17);
        System.out.println(numberIn2DArray);
    }

}
  • 不过还是k神的方法好,不用考虑越界问题
    public static boolean findNumberIn2DArray2(int[][] matrix, int target) {
        // 定义指针从右上角开始走
        int i = matrix.length - 1, j = 0;
        // 若越界直接返回false
        while (i >= 0 && j < matrix[0].length) {
            // 若当前值大于目标值 向左走一步
            if (matrix[i][j] > target) i--;
            // 若当前值小于目标值 向下走一步
            else if (matrix[i][j] < target) j++;
            // 若相等返回true
            else return true;
        }
        return false;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值