力扣 1. 两数之和

题目说明

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

    你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

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

  • 提示:

    • 2 <= nums.length <= 10^4
    • -10^9 <= nums[i] <= 10^9
    • -10^9 <= target <= 10^9
    • 只会存在一个有效答案

示例

示例 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]

笔者理解

此题是一道数组算法问题,在力扣题库中被定义为简单题,同时也是题库中的第一题。

解法

当笔者阅读完此题后,发现此题用哈希表记录比较容易求解,让我们来看看具体如何实现的吧。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
/*
* 哈希表
*/
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> map = new HashMap();
int n = nums.length;

int[] result = new int [2];

for (int i = 0; i < n; i++) {
int temp = map.getOrDefault(target - nums[i], -1);
// 如果哈希表中没有对应能组成target值的元素
// 将当前遍历到的元素的值和对应的下标存入哈希表中
if (temp == -1) {
map.put(nums[i], i);
}
// 如果找到了能组成target的两个值,直接返回对应下标
else {
result[0] = map.get(target - nums[i]);
result[1] = i;
break;
}
}

return result;
}
}

时间空间效率都还行,可见此解法还比较适合此题;

image-20210807115814742

总结

本题是今天的一题,难度是为简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。