在一个 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
思路
因为之前在PAT上写过相关的题目,所以一开始的想法是直接建立一个boolean
类型的一维数组,其下标代表所要查找的数(即:target
)。然后读取完二维数组之后,直接用所给的target
访问数组就能知道结果了。
但是事实证明我太天真,n*m
的大小已经到了106这样一个级别,声明这么大的一个数组是不允许的(通过率↓)。
于是我开始想用ArrayList
来做,这个东西应该对应着C++STL库里的vector
,但是呢,虽然他们俩都是变长数组,支持通过下标进行随机访问,但存储数据的时候一定是一个挨着一个存的,也就是说,此时的下标是严格从0开始的,也就不能代表我们所要查询的数据。
因此,最后选择用HashMap
来完成,这应该就是对应着C++STL库里的map
,通过键值对来存储数据,并且支持通过访问键得到值这样一个操作(貌似HashTable
和Dictionary
也支持key
和value
的模式,三者之间的区别并没有完全搞清楚_(:з」∠)_)。
接下来的操作就很简单了,声明一个由Integer
映射到Boolean
的HashMap
,每次读取的时候把当前的key
设置成true
。最后返回我还是写了try...catch
,因为如果查无此数,HashMap
的对象并不存在(为null
),程序会报错,那么把它catch
住之后返回false
就好了。
代码
import java.util.HashMap;
public class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
HashMap<Integer, Boolean> hashMap = new HashMap<Integer, Boolean>();
for(int i=0;i<matrix.length;i++) {
for(int j=0;j<matrix[i].length;j++) {
hashMap.put(matrix[i][j], true);
}
}
try {
return hashMap.get(target);
}catch(Exception e){
return false;
}
}
}