题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
方法:哈希表法
思路:哈希表是以空间换时间的方法,倘若使用暴力解法,则时间复杂度是O(n^2),转而用哈希表的话时间复杂度缩小到了O(n),遍历一次就完成了任务
import java.util.HashMap;
import java.util.Map;
public class Liangshuxiangjia {
public int[] twoSum(int [] nums,int target){
int [] res = new int[2];
//如果数组为空,返回空数组
if(nums == null || nums.length ==0){
return res;
}
//新建哈希表
Map<Integer,Integer> map = new HashMap<>();
//遍历数组,判断map中是否存在一个值等于target-num[i]
//如果有,返回当前的元素的值,以及target-num[i]
// 如果没有,将target-nums[i]的差值存入集合
for (int i = 0; i <nums.length; i++) {
int temp = target-nums[i];
if(map.containsKey(temp)){
res[1] = i;
res[0] = map.get(temp);
}
map.put(nums[i],i);
}
return res;
}
public static void main(String[] args) {
int[] nums = {2,5,6,7};
Liangshuxiangjia liangshuxiangjia = new Liangshuxiangjia();
int [] res = liangshuxiangjia.twoSum(nums,9);
for (int x:res) {
System.out.print(x+" ");
}
}
}
输出结果:
0 3
时间复杂度:O(n)