题目链接:1. 两数之和 - 力扣(LeetCode)
解题思路
问题描述
给定一个整数数组 nums
和一个整数目标值 target
,我们需要在这个数组中找到两个整数,它们的和等于 target
,并返回这两个整数在数组中的下标。
解题思路
解决这个问题的一种有效方法是使用哈希表(也称为字典或映射)。哈希表允许我们快速检查一个元素是否已经在数组中出现过,并且可以存储元素与其下标之间的映射。
以下是详细的步骤:
-
创建哈希表:首先,创建一个空的哈希表,用于存储数组中每个元素的值及其对应的下标。
-
遍历数组:然后,遍历数组
nums
中的每个元素。 -
计算补数:对于每个元素
nums[i]
,计算它的补数,即target - nums[i]
。这个补数是我们要找的另一个数,使得它与当前元素的和等于target
。 -
检查补数是否在哈希表中:检查这个补数是否已经在哈希表中。如果在,这意味着我们找到了一对元素,它们的和等于
target
。我们可以直接返回这两个元素的下标。 -
将当前元素添加到哈希表中:如果补数不在哈希表中,将当前元素
nums[i]
及其下标i
添加到哈希表中,然后继续检查下一个元素。 -
返回结果:当找到一对元素的和等于
target
时,我们返回它们的下标。
示例
用示例1来说明这个过程:
nums = [2,7,11,15]
,target = 9
- 遍历数组:
- 当
i = 0
时,nums[i] = 2
,补数是9 - 2 = 7
。检查7是否在哈希表中。不在,所以将2
和0
添加到哈希表中。 - 当
i = 1
时,nums[i] = 7
,补数是9 - 7 = 2
。检查2是否在哈希表中。在,所以找到了一对元素,它们的和等于9。我们返回下标[0, 1]
。
- 当
代码实现
class Solution {
public int[] twoSum(int[] nums, int target) {
//新建一个hashmap用来记录以及出现过的数
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){// 遍历数组
if(map.containsKey(target - nums[i])){// 判断之前加入map中的数组中的值是否包含目标值
return new int[]{i,map.get(target - nums[i])};// 找到就返回结果
}
map.put(nums[i],i);//没找到就将当前遍历值加入map中
}
return new int[0];
}
}