两数之和(力扣第一题)
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。
示例 1:
输入:nums
文章目录
(文章目录)
一、思想
第一种,暴力枚举,将数组中任意两个元素相加,看是否等于target值,但是这种方法的时间复杂度为O(n^2)。我们可以用更加高级的方法,利用哈希算法,以target与元素的差作为哈希算法的核心。首先,判断哈希表里面是否有这个数,假如有,则将元素的下标以及哈希表对应元素的下标(hash.get()方法)保存并且return它们,假如没有,则将该元素与target的差放在哈希表下表为该元素的下标中,等到在后面的遍历中被查到相应的值。此时,时间复杂度:O(N)O(N),其中 NN 是数组中的元素数量。对于每一个元素 x,我们可以 O(1)O(1) 地寻找 target - x,时间复杂度为O(n)。
二、代码
import java.util.HashMap;
import java.util.Map;
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] indexs=new int [2];
HashMap<Integer,Integer> hash = new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++){
if(hash.containsKey(nums[i])){
indexs[0]=i;
indexs[1] = hash.get(nums[i]);
return indexs;
}
hash.put(target-nums[i],i);
}
return indexs;
}
}