DAY 36 leetcode 1--哈希表.两数之和
题号1
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
我的解法一:两重循环
class Solution {
public int[] twoSum(int[] nums, int target) {
int size=nums.length;
int slow=0;
int fast=1;
int []arr=new int[2];//将返回的答案数组
outloop:
for(int i=0;i<size;i++){
for(int j=i+1;j<size;j++){
if(nums[i]+nums[j]==target)
{
arr[0]=i;
arr[1]=j;
break outloop;
}
}
}
return arr;
}
}
缺点:时间复杂度高
我的解法二
class Solution {
public int[] twoSum(int[] nums, int target) {
int []arr=new int[2];
Map <Integer,Integer>map=new HashMap<>();//创建哈希map
int size=nums.length;
for(int i=0;i<size;i++){
//每次存之前检测,是否包含可以使得将存元素与其相加等于target的元素
if(!map.containsKey(target-nums[i]))
map.put(nums[i],i);
else
{
arr[0]=i;
arr[1]=map.get(target-nums[i]);
break;
}
}
return arr;
}
}
此解法的关键,回答四个问题:
- 为什么会想到用哈希表
- 哈希表为什么用map
- 本题map是用来存什么的
- map中的key和value用来存什么的
为何想到哈希表:当我们需要查询一个元素是否出现过,或者是否在集合中时第一时间想到哈希表
哈希表为何用map:因为要同时保存下标和对应数值,用集合实现不了
map用来存什么:已经遍历过的下标和对应数值
因为要判断元素是否出现,key用来存数值,有key对应的就是value,value用来存下标。