LeetCode 第1题:两数之和
1.LeetCode 第10题:正则表达式匹配
2.LeetCode 第1题:两数之和
3.LeetCode 第2题:两数相加4.LeetCode 第3题:无重复字符的最长子串5.LeetCode 第4题:寻找两个正序数组的中位数6.LeetCode 第8题:字符串转换整数 (atoi)7.LeetCode 第7题:整数反转8.LeetCode 第6题:Z字形变换9.LeetCode 第5题:最长回文子串10.LeetCode 第9题:回文数11.LeetCode 第11题:盛最多水的容器12.LeetCode 第12题:整数转罗马数字13.LeetCode 第13题:罗马数字转整数14.LeetCode 第14题:最长公共前缀15.LeetCode 第15题:三数之和16.LeetCode 第16题:最接近的三数之和17.LeetCode 第17题:电话号码的字母组合18.LeetCode 第18题:四数之和19.LeetCode 第19题:删除链表的倒数第N个结点20.LeetCode 第20题:有效的括号21.LeetCode 第21题:合并两个有序链表22.LeetCode 第22题:括号生成23.LeetCode 第23题:合并K个升序链表24.LeetCode 第24题:两两交换链表中的节点25.LeetCode 第25题:K 个一组翻转链表26.LeetCode 第26题:删除有序数组中的重复项27.LeetCode 第27题:移除元素28.LeetCode 第28题:找出字符串中第一个匹配项的下标29.LeetCode 第29题:两数相除30.LeetCode 第30题:串联所有单词的子串31.LeetCode 第31题:下一个排列32.LeetCode 第32题:最长有效括号33.LeetCode 第33题:搜索旋转排序数组34.LeetCode 第34题:在排序数组中查找元素的第一个和最后一个位置35.LeetCode 第35题:搜索插入位置36.LeetCode 第36题:有效的数独37.LeetCode 第37题:解数独38.LeetCode 第38题:外观数列39.LeetCode 第39题:组合总和40.LeetCode 第40题:组合总和 II41.LeetCode 第41题:缺失的第一个正数LeetCode 第1题:两数之和
题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
难度
简单
题目链接
https://leetcode.cn/problems/two-sum/
示例
示例 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
- 只会存在一个有效答案
解题思路
方法一:暴力枚举
最直观的方法是使用两层循环枚举所有可能的数字对。
- 时间复杂度:O(n²)
- 空间复杂度:O(1)
- 优点:代码简单直观,空间复杂度低
- 缺点:时间复杂度高,在数组较大时性能较差
具体步骤:
- 使用两层循环,外层循环 i 遍历数组的每个元素
- 内层循环 j 从 i+1 开始遍历,寻找和为 target 的另一个数
- 如果找到 nums[i] + nums[j] == target,返回下标 [i, j]
- 如果遍历完没找到,返回空数组
方法二:哈希表
使用哈希表可以将时间复杂度降到 O(n):
- 创建一个哈希表,用于存储每个数字和其下标
- 遍历数组,对于每个数字 num:
- 计算补数 (target - num)
- 如果补数在哈希表中,则找到答案
- 否则将当前数字和下标加入哈希表
- 时间复杂度:O(n)
- 空间复杂度:O(n)
- 优点:时间复杂度低,查找效率高
- 缺点:需要额外的空间存储哈希表
代码实现
C# 实现(暴力解法)
public class Solution {
public int[] TwoSum(int[] nums, int target) {
// 外层循环遍历每个元素
for (int i = 0; i < nums.Length; i++) {
// 内层循环从i+1开始,避免重复使用同一个元素
for (int j = i + 1; j < nums.Length; j++) {
// 如果找到两个数的和等于target
if (nums[i] + nums[j] == target) {
return new int[] { i, j };
}
}
}
// 如果没有找到符合条件的数对,返回空数组
return new int[0];
}
}
C# 实现(哈希表解法)
public class Solution {
public int[] TwoSum(int[] nums, int target) {
// 创建字典存储数字和对应的索引
Dictionary<int, int> map = new Dictionary<int, int>();
// 遍历数组
for (int i = 0; i < nums.Length; i++) {
// 计算当前数字需要的补数
int complement = target - nums[i];
// 如果字典中存在这个补数,说明找到了答案
if (map.ContainsKey(complement)) {
return new int[] { map[complement], i };
}
// 如果当前数字不在字典中,将其添加到字典
if (!map.ContainsKey(nums[i])) {
map.Add(nums[i], i);
}
}
// 如果没有找到符合条件的数对,返回空数组
return new int[0];
}
}
执行结果
暴力解法
- 执行用时:308 ms
- 内存消耗:42.8 MB
哈希表解法
- 执行用时:156 ms
- 内存消耗:43.5 MB
总结与反思
- 这是一道经典的入门题目,考察了基本的算法思维
- 暴力解法虽然直观,但效率较低
- 使用哈希表可以用空间换时间,提高效率
- 这道题告诉我们:
- 在处理查找问题时,哈希表往往是一个很好的选择
- 有时候可以通过增加空间复杂度来降低时间复杂度
- 在实际工程中,通常优先考虑时间复杂度,因为内存通常较为充足
相关题目
- LeetCode 第15题:三数之和
- LeetCode 第167题:两数之和 II - 输入有序数组
- LeetCode 第653题:两数之和 IV - 输入二叉搜索树
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库