问题描述:
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
Java
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map =new HashMap();
int []a=new int[2];
for(int i=0;i<nums.length;i++)
{
map.put(target-nums[i],i);
}
for(int i=0;i<nums.length;i++)
{
if(map.containsKey(nums[i])==true && i!=map.get(nums[i]))
{
a[0]=i < map.get(nums[i])?i:map.get(nums[i]);
a[1]=i > map.get(nums[i])?i:map.get(nums[i]);
break;
}
}
return a;
}
}
第一遍遍历:将(target-a)和i 作为键值对,存入Hash表,遍历时间复杂度为O(n),
第二遍遍历:查询在Hash表中有和当前数相同的key,每次查询时间复杂度为O(1),遍历时间复杂度为O(n),
总的时间复杂度是O(2n)。
关于Hash表:Hash表是根据关键码值(Key value)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。