一.题目描述
给定一个整数数组 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]
三.提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
- 只会存在一个有效答案
四.解法:
方法一:哈希表
我们可以使用一个哈希表 d 来存储每个元素及其对应的索引。
遍历数组 nums,对于当前元素 nums[i],我们首先判断 target−nums[i] 是否在哈希表 d 中,如果在 d 中,说明 target 值已经找到,返回 target−nums[i] 的索引和 i 即可。
时间复杂度 O(n),空间复杂度 O(n),其中 n 为数组 nums 的长度。
Java代码
class Solution {public int[] twoSum(int[] nums, int target) {// 创建一个哈希映射,用于存储数组元素的值和对应的索引Map<Integer, Integer> d = new HashMap<>();// 遍历数组for (int i = 0;; ++i) {// 获取当前索引 i 处的数组元素int x = nums[i];// 计算与 x 互补的值 yint y = target - x;// 检查哈希映射中是否存在键 yif (d.containsKey(y)) {// 如果存在,返回两个数的索引return new int[] {d.get(y), i};}// 将当前元素 x 及其索引 i 存入哈希映射d.put(x, i);}}
}
Kotlin代码
class Solution {fun twoSum(nums: IntArray, target: Int): IntArray {// 创建一个可变的哈希映射,用于存储数组元素的值和对应的索引val m = mutableMapOf<Int, Int>()// 使用 forEachIndexed 遍历数组,获取每个元素及其索引nums.forEachIndexed { i, x ->// 计算与 x 互补的值 yval y = target - x// 从哈希映射中获取 y 的索引 jval j = m.get(y)// 如果 j 不为 null,说明找到了两个数if (j != null) {// 返回两个数的索引return intArrayOf(j, i)}// 将当前元素 x 及其索引 i 存入哈希映射m[x] = i}// 如果没有找到,返回一个空的数组return intArrayOf()}
}