LeetCode第1题:两数之和
2019-07-31 本文已影响14人
你偷了我的小鱼干
本文首发于公众号「猿天罡」
题目来源于 LeetCode,第一题。
1. 题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
2. 解题思路
题目的意思是像让我们从给定的 nums
数组中,找到两个相加等于 target
的数 a
和 b
并返回这两个数在数组中对应的下标 i
和 j
。
具体思路如下:
-
定义一个映射关系map,map 中保存的数据结构形如
<target-nums[k], k>
,其中 k∈[0, nums.length); -
遍历给定的数组
2.1 如果
nums[k]
存在于 map 的 key键中,则 key键 对应的 value值和当前的 k值 就是我们要找的两个下标;2.2 如果
nums[k]
不存在于 map 的 key键中,则把<target-nums[k], k>
保存到 map中; -
循环结束。
3. 代码实现
个人精力有限,目前只有 Java 代码的算法实现,后续可能会考虑增加其他语言的实现,敬请期待哦~
3.1 Java 实现
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i++) {
// 如果nums[i]在map中,则返回nums[i]对应的值和i
if (map.containsKey(nums[i])) {
return new int[] {map.get(nums[i]), i};
}
// 如果nums[i]不在map中,则在map中插入 (target-nums[i],i)
map.put(target-nums[i], i);
}
return null;
}
}
4. 算法动画
假设给定数组 nums
为 [2, 7, 11, 15]
,目标值 target
等于9,依照上面给出的算法,运行过程如下图:
5. 结尾语
算法是计算机编程的灵魂,却又以其艰涩难懂使人望而却步,所以笔者希望能以动画的形式降低初学者的理解难度。
如果你觉得本文对你有所帮助,欢迎扫码关注下方↓↓↓公众号
公众号-猿天罡