问题描述:给定一个整数数组nums和一个目标值target,请你在该数据中找出 和 目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案,但是,数组中同一个元素不能使用两遍。
实例:给定 nums=[2,7,11,15],target = 9。因为nums[0] + nums[1] = 2+7 = 9,所以返回[0,1]
解法一、暴力枚举
枚举数组中的每一个元素x,寻找数组中是否有元素y满足x+y == target,即y=target-x;当我们使用遍历整个数组的方式寻找target-x时,需要注意到每一个位于x之前的元素都已经和x匹配过,所以不需要再进行匹配,而每一个元素不能被使用两次,所以只需要在x后面的元素中寻找target-x。
时间复杂度:O(N^2);空间复杂度:O(1)
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){
ret[0] = i;
ret[1] = j;
}
}
}
return ret;
}
}
解法二、哈希表
创建一个哈希表,对于每一个元素x,首先查询哈希表中是否存在target-1,若不存在,则将x插入哈希表中(保证了x和自己不会匹配,同时可能后面会出现与x匹配上的数据)
public int[] twoSum(int[] nums, int target) {
/**
* 二、使用哈希表,对每一个x,去寻找target-1
* 创建一个哈希表,对于每一个元素x,首先查询哈希表中是否存在target-1,若不存在,则将x插入哈希表中(保证了x和自己匹配,同时可能后面会出现元素与x匹配上)
*/
int[] ret = new int[2];
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i++) {
int v = target - nums[i];
if (map.get(v) != null && v + nums[i] == target && map.get(v) != i) {
ret[0] = i;
ret[1] = map.get(v);
return ret;
} else {
map.put(nums[i], i);
}
}
return ret;
}
}