题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

解题思路

本题要求在一个数组中找出两个和为 target 的数,并返回它们的下标。最直观的做法是双重循环遍历,时间复杂度为 O(n²),但这不是最优解。

更高效的做法是使用哈希表。核心思路是:遍历数组,对于每个元素 nums[i],我们计算出它需要的配对值 target - nums[i],然后在哈希表中查找该配对值是否已经出现过。如果出现过,说明我们找到了答案,直接返回两个下标即可;如果没有出现,则将当前元素的值和下标存入哈希表,供后面的元素查找。

这样做的好处是:

  1. 每个元素只需要遍历一次,时间复杂度为 O(n)
  2. 通过哈希表的 O(1) 查找,快速判断配对值是否存在
  3. 一次遍历即可完成查找和存储,简洁高效

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组长度。只需要遍历一次数组,每次查找和插入哈希表都是 O(1)。
  • 空间复杂度:O(n),哈希表中最多存储 n 个元素。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package code.J1;

import java.util.HashMap;
import java.util.Map;

public class J1 {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(target - nums[i])) {
return new int[]{map.get(target - nums[i]), i};
}
map.put(nums[i], i);
}
return null;
}
}