1.两数之和

本文最后更新于:2 个月前

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个
整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

示例 1:

1
2
3
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

示例 2:

1
2
输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

1
2
输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

题目思路

当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。

本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是
是否出现在这个集合。

那么我们就应该想到使用哈希法了。

因为本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key value结构来存放, key来存元素,value来存下标,那么使用map正合适。

再来看一下使用数组和set来做哈希法的局限。

  • 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费
  • set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和
    y的下标。所以set 也不能用

此时就要选择另一种数据结构:map ,map是一种key — value的存储结构,可以用key保存数值,用value再保存数值所在的下标

两数之和

题解代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class _001_twoSum {
public int[] twoSum(int[] nums, int target) {
// 「key:数组元素 value:元素对应数组下标」
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int num = nums[i];
if (map.containsKey(target - num)) {
// 如果map中存了和当前元素配对的元素,直接取下标返回
return new int[]{i, map.get(target - num)};
} else {
// 否则将当前元素放入map
map.put(num, i);
}
}
return null;
}
}

1.两数之和
http://example.com/2025/01/15/001-两数之和/
作者
Ovo-
发布于
2025年1月15日
许可协议