我正在参加「掘金·启航计划」
题目描述:Q1:两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
2 <= nums.length <= 104-109 <= nums[i] <= 109-109 <= target <= 109- 只会存在一个有效答案
**进阶:**你可以想出一个时间复杂度小于 O(n2) 的算法吗?
思路 & CODE
又回到最初的起点,记忆中你青涩的脸,重复一遍又一遍:abandon、abandon、abandon......
又是打算从头刷算法的一天,打开提交记录发现两数之和已经提交五次了,这次我发下毒誓,从今天开始每天都刷一道题,如果违约,每天都掉一斤肉!
1. 哈希
遥想第一次做这道题,用for循环十分钟就解出来了,当时就觉得自己是个算法天才,评论区也给了我莫大的鼓励
再次遇到这道题,发现双重for循环真是太繁琐了,不由得再次佩服当时的自己。碰到关于两个对象比较的问题基本都可以用哈希来解决。
这道题的本质就是将【当前遍历的数】与【其它的数】进行比较。
- 其它的数放在数组中
如果我们只知道数组这种数据结构的话,那么就只能再写一个for循环将【当前遍历的数】与【数组中其它的数】进行比较了。
- 其它的数放在哈希表中
相信大家都背过HashMap的八股文,HashMap的底层也是一个数组,通过对key进行哈希计算,再根据数组长度取模就得到了key在数组中的索引位置。单纯使用数组需要遍历N个数进行比较,而使用哈希只需要一次计算就能得到结果!
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (null != map.get(target - nums[i])) {
return new int[]{i, map.get(target - nums[i])};
}
map.put(nums[i], i);
}
return null;
}
总结
- 两个数的比较可以考虑使用哈希
- 查表法:使用哈希表可以去掉内层for循环