LeetCode-两数之和
1.LeetCode-两数之和
2.LeetCode-两数相加前言
这道题是Leetcode的第一题,也是经典题目之一,几乎所有刷题网站的第一题都是“两数之和”,只是Leetcode这道题不一样。
在这篇博客中,我们介绍了两种解法:
暴力算法 | 哈希表算法 |
---|---|
题目描述
给定一个整数数组 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]
示例2:
输入:nums = [3,3], target = 6 输出:[0,1]
提示
- 只会存在一个有效答案
题目分析
由于题目描述得比较清晰,所以不用过多分析。需要注意的是,题目已经说明每种输入只对应一个答案,说明我们不用考虑有多个答案的情况。
暴力算法
阅读完题目之后,首先能想到的解法就是确定一个值
解题代码
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { for (int i = 0 ; i < nums.size() - 1 ; i ++) { /* j 从 i+1 开始,是因为两个下标不能相同,题目有说明*/ for (int j = i + 1 ; j < nums.size() ; j++) { if ( nums[j] == target - nums[i]) { return {i , j}; } } } return {}; } };
复杂度分析
设
因此
我们在刚开始刷题的时候,可以先试着自己写出暴力算法,然后分析一下时间复杂度,再尝试其他解题方法。
由暴力算法可以得知,主要的时间消耗是在寻找
上,如果能降低寻找 的时间,就能实现一个时间复杂度小于 的算法。
因此我们考虑用 哈希表 来解决这一问题 。
哈希表算法
最开始接触到哈希表思想是从桶排序算法,它的典型思想是以空间换时间,哈希表的时间复杂度为
我们可以将数组分为两部分,如下图:
解题代码
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int,int> idx; for (int j = 0 ; j < nums.size() ; j++) { auto it = idx.find(target-nums[j]); if ( it != idx.end()) { return { it->second , j}; } idx[nums[j]] = j; } return {}; } };
复杂度分析
设
空间复杂度为
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库