给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
对于leetcode的这第一道题刚开始刷算法时看见题目不就是计算两个数的和吗还是简单题看我不kuchikuchi拿下10min~(嗯,有点意思)30min(好像有点难度哈)2h~(这题不做也罢!)开玩笑[狗头],但确实初入算法的世界这第一道题就将我难住了随后也吭哧吭哧用暴力解法解了出来但感觉好累啊算法好难学啊,直至今天重新拾起信心学习算法刷起算法题才领悟到算法的奥妙;
分析题意可知我们选定一个数组元素时要再找到另一个不重复的元素两者之和要等于target并返回两个元素的下标由此除了暴力解法我们还可以想到Map<key,value>的数据结构来存储元素key存储元素的值value存储元素的下标那么当我们遍历给定数组时只需要在Map中找到target-当前遍历的数组元素即可(同一元素不能重复使用)如果在Map中命中返回当前遍历的数组元素下标与Map的值即可
自己的解法(先将数组元素全部存储至Map中再索引Map并判断)
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> record = new HashMap();
int[] res = new int[2];
for (int i = 0; i < nums.length; i++) {
record.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int num = target - nums[i];
if (record.containsKey(num)&&i!=record.get(num)) {
res[0] = i;
res[1] =record.get(num);
return res;
}
}
return res;
}
}
优质解法(边判断Map是否命中如果未命中则放入Map如果命中则返回对应下标)
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> record = new HashMap();
for (int i = 0; i < nums.length; i++) {
int num = target - nums[i];
if(!record.containsKey(num))
record.put(nums[i],i);
else return new int[]{i,record.get(num)};
}
return null;
}
}