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

限制:

0 <= n <= 1000

0 <= m <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

首先,这个二维数组的数据分布是有规律可循的,从左到右递增,从上至下递增,那么就是左上角为二维数组最小元素,右下角为二维数组最大元素。

那么需要高效查找到对应元素,肯定不可以从最大或者最小这两端开始查找了,对于有递增或者递减的数组查找问题,可以考虑二分查找。

这个二维数组还不算太大,其非严谨中间值为左下角元素或者右上角元素,从这俩哪一个开始都可以。

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        for(int i = matrix.length - 1,j = 0;i >= 0 && j < matrix[0].length;){
            if(matrix[i][j] > target) i--;
            else if (matrix[i][j] < target) j++;
            else return true;
        }
        return false;
    }
}

从左下角元素开始,如果元素大于target,那么往上面一行查找,直到小于等于target

遇到小于target的元素,则在这一行向右查找,直到大于或者等于target,

如果大于target再往上面一行查找,以此类推,直到找到target或者遍历完都没找到target。

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

以5为例,从18开始查找,18大于5,往上面一行,直到3小于5为止

在这一行往右查找,6大于5,再往上面一行查找,查找到5 == 5,返回true。


学习方面,不要感动自己,也不要伪勤奋。比如想学什么东西了,在网上查了一大堆资料,关注了一大堆博主,自己却没有开始动手做,囤资料一大堆却从没看过,收藏夹都在吃灰,这样的就是伪勤奋。

你的下载资料的行为,收藏文章的行为,给了你一种“我已经努力了”的错觉,实际上你根本没有去真正动手做,这样的行为只能减轻你的负罪感,对于学习并没有什么帮助。

那么在学习中,该怎么避免这样的行为呢?

立刻去做!

在做的过程中不断改进,结合实践再做查资料等行为来不断完善。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值