给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
一、脑子里先想到的
就两个数,第一个数从头数,第二个数从第一个数下一个开始数,且这两个数不是自身即被重复利用的情况。
结果:通过 。 29 / 29 个通过测试用例 执行用时:167 ms
但是!你看看别人的时间!这种暴力的方法是不对的!
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] result = null;
for(int i=0; i<(nums.length-1); i++){
for(int j=1; j<nums.length; j++){
if((nums[i] + nums[j] == target) & (i != j)){
result = new int[]{i, j};
}
}
}
return result;
}
}
二、这才是好的
把数组存到HashMap里,值->下标,每存新的一个数就检查已存在的键值对里是否有和它相加目标为target的,有就返回下标,无就把它添加进HashMap
执行用时10ms(要是先定义int[] result = null;后面再赋值的话,也会耗费时间)
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> numsmap = new HashMap<>();
for(int i=0; i<nums.length; i++){
int d = target - nums[i];
if(numsmap.containsKey(d)){
return new int[]{numsmap.get(d), i};
}else{
numsmap.put(nums[i], i);
}
}
return null;
}
}
这个时间可能有波动吧,我用执行用时7ms即最高的那个柱子的范例提交了一遍,结果是12ms