美文网首页
Array-0001

Array-0001

作者: FightinsTfate | 来源:发表于2019-03-23 15:35 被阅读0次

写在启航之前

最近想着提高一下编码能力,于是开始刷LeetCode,开始的刷题速度可能非常慢,但是相信只要坚持下去,及时记录与总结,总有一天······会跟上LeetCode的出题速度的😄
我是按题目标签为类,从简到难为序来刷题的,第一个标签就是最基础的Array。

Array

  1. 两数之和

给定一个整数数组 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对象的一些性质帮我们快速解决这个问题。

  1. 首先我们可以所有的索引与值存放到一个Map对象中,作为数据的准备,当然这也意味着,这种解法的时间复杂度肯定不会小于lgN了。
Map<Integer, Integer> hash = new HashMap<>();
for (int i=0; i<nums.length; i++) {
    hash.put(nums[i], i);
}
  1. 接下来,我们开始对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) };
    }
}
  1. 最后把结果存储一下,返回。
    Done.

相关文章

  • Array-0001

    写在启航之前 最近想着提高一下编码能力,于是开始刷LeetCode,开始的刷题速度可能非常慢,但是相信只要坚持下去...

网友评论

      本文标题:Array-0001

      本文链接:https://www.haomeiwen.com/subject/lujsvqtx.html