LeetCode——剑指 Offer 04 二维数组中的查找(JAVA)

这篇博客讨论了一种在n*m的二维数组中查找特定整数的高效方法。由于数组每一行和每一列都有序,作者最初尝试用一维数组存储,但由于空间限制转向使用HashMap。HashMap允许通过键(目标整数)直接获取值(是否存在),避免了遍历整个数组。最终,通过尝试获取目标值并捕获异常来处理不存在的情况,实现了高效的查找功能。
摘要由CSDN通过智能技术生成

在一个 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,通过键值对来存储数据,并且支持通过访问键得到值这样一个操作(貌似HashTableDictionary也支持keyvalue的模式,三者之间的区别并没有完全搞清楚_(:з」∠)_)。
接下来的操作就很简单了,声明一个由Integer映射到BooleanHashMap,每次读取的时候把当前的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;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值