力扣(LeetCode)是一个著名的在线编程平台,提供了许多算法和数据结构相关的编程题目,
是程序员求职面试,大学生编程竞赛刷题的常用平台网站。
对于“两数之和“这道题,刷过力扣的小伙伴一定不陌生,因为这是LeetCode的第一题,可以说是刷题的起点。
题目描述如下:
看到这道题目,很容易想到暴力求解,用两层for循环,时间复杂段为O(N2)。
本文提供另一种解法,使用哈希表来记录遍历过的数,这样遍历下一个数时,只需要查找哈希表中有没有与当前数相加之和是target的数就好。
解题思路:
创建一个哈希表(字典),用于存储每个元素的值和索引。
遍历数组,检查target与当前元素差值是否在哈希表中:
如果存在,则返回差值的索引和当前索引;
如果不存在,在哈希表中记录当前元素与索引值,继续遍历下一个元素。
如果遍历完整个数组后仍然没有找到答案,则返回{0,0}。
这种解法将算法的时间复杂度降到了N*O(1).
代码实现如下:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> visited;
for(int i = 0; i < nums.size();++i)
{
auto it = visited.find(target - nums[i]);
if(it != visited.end())
{
return {it->second,i};
}
visited.insert(std::pair(nums[i],i));
}
return {0,0};
}
在LeetCode平台运行结果: