Two Number
给定一个整数数组,返回两个数字的索引,使它们相加到特定目标。
您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解题思路:首先创建一个HashMap,遍历数组中的元素将数组元素以及元素索引存在Map中,然后再次遍历数组中元素,求出该元素num1对应的差值num2,再查看num2是否存在于key的集合中如果存在那么查找num2的索引值num2_index,可能存在特殊情况如:数组[3,2,4] target=6,因为3的差值仍然为3所以需要判断num2_index和i是否相同,如果相同说明是同一个元素不符合要求,如果不相同说明不是同一个元素可以设置到结果数组中
附上代码:
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] result=new int[2];
HashMap<Integer,Integer> map=new HashMap();
for(int i=0;i<nums.length;i++)
{
map.put(nums[i],i);
}
for(int i=0;i<nums.length;i++)
{
int num1=nums[i];
int num2=target-num1;
int num2_index;
//这里用&&比使用两个if效率更高
if(map.containsKey(num2)&&(num2_index=map.get(num2))!=i)
{
result[0]=i;
result[1]=num2_index;
return result;
}
}
return null;
}
}
时间复杂度分析:HashMap在不发生冲突的情况下也就是最理想情况下,get、put方法的时间复杂度都是O(1),HashMap在发生冲突的时候时间复杂度应该是O(n),所以按最理想情况来看该算法的时间复杂度为O(n)