在一个 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。
学习方面,不要感动自己,也不要伪勤奋。比如想学什么东西了,在网上查了一大堆资料,关注了一大堆博主,自己却没有开始动手做,囤资料一大堆却从没看过,收藏夹都在吃灰,这样的就是伪勤奋。
你的下载资料的行为,收藏文章的行为,给了你一种“我已经努力了”的错觉,实际上你根本没有去真正动手做,这样的行为只能减轻你的负罪感,对于学习并没有什么帮助。
那么在学习中,该怎么避免这样的行为呢?
立刻去做!
在做的过程中不断改进,结合实践再做查资料等行为来不断完善。