[面试精选] 0001. 两数之和
文章目录
- 1. 题目链接
- 2. 题目描述
- 3. 题目示例
- 4. 解题思路
- 5. 题解代码
- 6. 复杂度分析
1. 题目链接
1. 两数之和 - 力扣(LeetCode)
2. 题目描述
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
3. 题目示例
示例 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]
4. 解题思路
- **哈希表: **使用哈希表来存储已经遍历过的数字及其索引,在O(1)时间内检查是否存在目标值(
tar - x
)。 - 一次遍历:对于每个元素,检查哈希表中是否存在对应的补数(即
tar - x
),如果存在则立即返回结果。
5. 题解代码
class Solution {public int[] twoSum(int[] nums, int tar) {// 创建一个哈希表来存储数字和对应的索引Map<Integer, Integer> idx = new HashMap<>();// 遍历数组for (int i = 0; ; i++) {int x = nums[i]; // 当前数字// 检查哈希表中是否存在目标值(tar - x)if (idx.containsKey(tar - x)) {// 如果存在,返回这两个数的索引return new int[]{idx.get(tar - x), i};}// 将当前数字及其索引存入哈希表idx.put(x, i);}}
}
6. 复杂度分析
- 时间复杂度:
- 遍历数组一次:O(n),其中
n
是数组的长度。 - 哈希表的插入和查找操作均为O(1)。
- 总时间复杂度:O(n)。
- 遍历数组一次:O(n),其中
- 空间复杂度:
- 哈希表存储最多
n
个数字及其索引:O(n)。 - 总空间复杂度:O(n)。
- 哈希表存储最多