01.两数之和
题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:输入:nums = [3,3], target = 6
输出:[0,1]来源:力扣(LeetCode)
解题思路1
我们分析一下题目可以很快想出一个朴素解法即双重循环暴力取值
class Solution {
public int[] twoSum(int[] nums, int target) {
int len = nums.length;
int[] res = new int[2];
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
if(nums[i]+nums[j]==target){
res[0]=i;
res[1]=j;
return res;
}
}
}
return res;
}
}
执行用时:55 ms, 在所有 Java 提交中击败了25.59%的用户内存消耗:41.6 MB, 在所有 Java 提交中击败了18.85%的用户
可以看出这种方法虽然可以成功但明显时间和空间复杂度都不优秀
解题思路2
利用HashMap来做,思路是map[target-nums[i]]=i ,即map的key存放的是目标值-数组元素 value存放的是数组下标
这样做的好处是什么,很容易想到 我们用一次循环来存放上述的key value,然后我们在利用一次循环数组元素并把数组元素作为key 来取值 如果取出的值不为空 则可以说明 此时 key+nums[value]=target。
为什么呢?因为我们map的key原本是target-nums[i],value是i,但我们第二次循环是把nums[i]作为key来取,如果此时取出的值不为空 必定说明 nums[i]是我们第一次循环存放的一个key 所以必定有 num[i]=target-nums[i]=key 而num[i]对应的value 与 target-nums[i]对应的value 就是我们要的答案
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++)
{
map.put(target-nums[i],i);
}
for(int i=0;i<nums.length;i++)
{
if(map.get(nums[i])!=null&&map.get(nums[i])!=i)
{
int[] res={i,map.get(nums[i])};
return res;
}
}
return null;
}
}