您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# LeetCode如何判断两数之和的结果是否等于给定的目标结果
## 引言
在算法学习和编程面试中,"两数之和"(Two Sum)是一个经典且基础的问题。它不仅是LeetCode上的第一道题目,也是许多开发者接触算法问题的起点。本文将深入探讨如何判断数组中是否存在两个数,它们的和等于给定的目标值,并分析不同解法的优劣。
---
## 问题描述
**题目**:
给定一个整数数组 `nums` 和一个整数目标值 `target`,请你在该数组中找出**和为目标值**的那**两个**整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,且同一个元素不能重复使用。
**示例**:
```python
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:nums[0] + nums[1] = 2 + 7 = 9
最直观的方法是遍历数组中的每一个元素 x
,并查找是否存在另一个元素 y
满足 x + y = target
。
def twoSum(nums, target):
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
return []
适用于小规模数据(如 n < 1000
),但面对大规模数据时效率极低。
通过空间换时间,利用哈希表(Python中为字典)存储已遍历的元素及其索引。对于当前元素 x
,检查 target - x
是否在哈希表中。
def twoSum(nums, target):
hash_map = {}
for i, num in enumerate(nums):
complement = target - num
if complement in hash_map:
return [hash_map[complement], i]
hash_map[num] = i
return []
n
个元素的哈希表。target
的比较调整指针位置。def twoSum(nums, target):
sorted_nums = sorted(zip(nums, range(len(nums))), key=lambda x: x[0])
left, right = 0, len(sorted_nums) - 1
while left < right:
current_sum = sorted_nums[left][0] + sorted_nums[right][0]
if current_sum == target:
return [sorted_nums[left][1], sorted_nums[right][1]]
elif current_sum < target:
left += 1
else:
right -= 1
return []
nums = [1,2,3], target = 7
,应返回空列表。nums = [3,3], target = 6
,需正确处理。nums = [-1,0,1], target = 0
。利用字典的简洁性:
hash_map = {}
for i, num in enumerate(nums):
...
使用 HashMap
:
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
...
}
使用 unordered_map
:
unordered_map<int, int> map;
for (int i = 0; i < nums.size(); i++) {
...
}
解法 | 时间复杂度 | 空间复杂度 | 适用场景 |
---|---|---|---|
暴力枚举 | O(n²) | O(1) | 小规模数据 |
哈希表 | O(n) | O(n) | 大规模数据 |
排序+双指针 | O(n log n) | O(n) | 需有序数据时 |
推荐选择:哈希表解法在大多数情况下最优,兼顾效率与代码可读性。
”`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。