题目描述:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
此题作者在今年4月份腾讯初试时被面试官问道,当时回答的并不好,故在此进行解题思路的整理并贴出代码。
解题思路:
暴力法:遍历每个元素nums[i],并在数组中查找是否存在一个值与 target - nums[i] 相等的目标元素。
复杂度分析:时间复杂度O(n²),空间复杂度O(1)
哈希表法:利用空间换时间的思想,先创建哈希表,在进行迭代并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。如果它存在,那我们已经找到了对应解,并立即将其返回。(由于java中有已经实现的HashMap,将map的键置为数组元素值,值置为数组下标值,故用java实现更方便)
复杂度分析:时间复杂度O(n),空间复杂度O(n)
暴力法比较简单,代码就不再展示,下面展示哈希表法的代码(java版):
class Solution {
public int[] twoSum(int[] nums, int target) {
int [] ans = new int[2];
if(nums==null||nums.length<2)
return ans;
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i = 0; i < nums.length; i++){
if(!map.containsKey(target-nums[i])){
map.put(nums[i],i);
}else{
ans = new int[]{map.get(target-nums[i]),i};
return ans;
}
}
return ans;
}
}