写在启航之前
最近想着提高一下编码能力,于是开始刷LeetCode,开始的刷题速度可能非常慢,但是相信只要坚持下去,及时记录与总结,总有一天······会跟上LeetCode的出题速度的😄
我是按题目标签为类,从简到难为序来刷题的,第一个标签就是最基础的Array。
Array
- 两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
这道题第一眼看上去有点懵逼,下意识都想着抬手作个揖,说句告辞了······
开个玩笑,这道题的一个特点是要观察到输入和输出存在的联系,我们的目标是:
找到存在key(A)和key(B),Value(A)+Value(B) = 9
因为数组中索引和值恰恰是这种KV关系,我们就可以借用Map对象的一些性质帮我们快速解决这个问题。
- 首先我们可以所有的索引与值存放到一个Map对象中,作为数据的准备,当然这也意味着,这种解法的时间复杂度肯定不会小于lgN了。
Map<Integer, Integer> hash = new HashMap<>();
for (int i=0; i<nums.length; i++) {
hash.put(nums[i], i);
}
- 接下来,我们开始对Map中每一个key去做目标等式的计算,即9 - key,然后利用HashMap的get(Object key),这也是为什么我们将数组的值作为Map的key存储,当然也不要忘记题干中的限制,不能重复使用相同数字。
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (hash.containsKey(complement) && hash.get(complement) != i) {
result = new int[] { i, hash.get(complement) };
}
}
- 最后把结果存储一下,返回。
Done.
网友评论