目录
- 力扣经典150题第四十三题:两数之和
- 题目描述
- 示例
- 解题思路
- 完整代码
- 复杂度分析
- 总结与结语
- 感谢您阅读本文,希望本文能帮助您更好地理解和掌握解决这道经典的算法问题!
力扣经典150题第四十三题:两数之和
题目描述
给定一个整数数组 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]
解题思路
一种简单的解决方案是使用哈希表(HashMap)来存储每个元素的值及其索引。我们遍历数组,对于每个元素 nums[i]
,计算目标值 complement = target - nums[i]
。然后检查哈希表中是否存在 complement
,如果存在则说明找到了答案,返回对应的索引。如果不存在,则将当前元素存入哈希表中。
完整代码
import java.util.HashMap;
import java.util.Map;
public class TwoSum {
public int[] twoSum(int[] nums, int target) {
// 创建哈希表,用于存储元素值和对应的索引
Map<Integer, Integer> map = new HashMap<>();
// 遍历数组
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
// 检查哈希表中是否存在 complement
if (map.containsKey(complement)) {
// 找到了满足条件的两个数,返回它们的索引
return new int[] { map.get(complement), i };
}
// 将当前元素存入哈希表中,值作为 key,索引作为 value
map.put(nums[i], i);
}
// 如果未找到符合条件的两个数,返回空数组
return new int[] {};
}
public static void main(String[] args) {
int[] nums1 = {2, 7, 11, 15};
int target1 = 9;
TwoSum solution = new TwoSum();
int[] result1 = solution.twoSum(nums1, target1);
System.out.println("示例 1 结果:" + Arrays.toString(result1));
int[] nums2 = {3, 2, 4};
int target2 = 6;
int[] result2 = solution.twoSum(nums2, target2);
System.out.println("示例 2 结果:" + Arrays.toString(result2));
int[] nums3 = {3, 3};
int target3 = 6;
int[] result3 = solution.twoSum(nums3, target3);
System.out.println("示例 3 结果:" + Arrays.toString(result3));
}
}
复杂度分析
- 时间复杂度:O(n),其中 n 是数组
nums
的长度。我们只需遍历一次数组,哈希表的插入和查找操作均为 O(1) 的时间复杂度。 - 空间复杂度:O(n),其中 n 是数组
nums
的长度。哈希表最多存储 n 个元素。
总结与结语
本题利用哈希表的快速查找特性,通过一次遍历数组即可找到和为目标值的两个元素。这种解法的时间复杂度为 O(n),空间复杂度也为 O(n),是一种高效的解决方案。
哈希表的使用在解决数组和字符串相关的问题中具有广泛的应用,能够有效地降低时间复杂度。
通过掌握哈希表的基本原理和操作,能够更加高效地解决类似的算法问题,提高编程的技能和效率。
感谢您阅读本文,希望本文能帮助您更好地理解和掌握解决这道经典的算法问题!