题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。例子如下所示:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
第一种方法是最简单的——暴力拆解。
利用两个for循环进行对nums数组的遍历,如果存在两数组元素相加得到target的话,那就肯定能找出来,如果不存在就肯定报错。代码如下所示:
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i = 0; i < nums.length ; i++){
for(int j = i + 1; j < nums.length; j++){
if(nums[i] + nums[j] == target) {
return new int[] { i, j };
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
}
这种暴力拆解的方法时间复杂度为 o(n^2)
第二种方法是利用哈希表(记录对应数组下标与所需值)
解题方法:设定一个complement值,complement = target - nums[i],意义在于记录当前的nums[i]的值与target相差多少,如果在后面的遍历查找中找到相应缺失的值,即可完成。使用哈希表的方法,可以只使用一次for循环遍历整个数组即可,其余交给map的方法。代码如下:
classSolution {
publicint[] twoSum(int[] nums,inttarget) {
Map map =newHashMap<>();
for(inti =0; i
intcomplement = target - nums[i];
if(map.containsKey(nums[i])){
returnnewint[]{map.get(nums[i]),i};
}
map.put(complement,i);
}
returnnewint[]{-1,-1};
}
}
这一道题虽然可以用暴力的办法去解决,但是即便是4个数组已经花费很多的时间,对于实际问题来说恐怕所花费的时间是恐怖的。这道题还引出了哈希表的用法,可以用于记录需要的值与对应的序号,而且哈希表对于占用内存来说很小,所以以后需要相关记录的题目,可以考虑哈希表。