算法,永远是检验一个程序员的能力大小的重要指标,也是提升自身能力所必备的专业技能。所以现在就要动手练习,同时,可以对C++有更加深刻的认识和理解。而LeetCode上可以和各位算法爱好者一起学习,是一个很好的平台。好好加油吧<->
题目:两数之和
1 | 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 |
1 | 示例: |
解题思路:
方法一:
使用两个for循环,从头到尾遍历nums,同时对比即可,这个方法很简单,但是时间复杂度为,实际的执行时间也到了180ms左右,显然不太好(代码在下面的注释里)。
方法二:
使用以空间换时间的方法,那也就是哈希表了,这里的思路就是使用关联容器中的无序集合类型——unordered_map。
在C++11中关联容器支持高效的关键字查找和访问。在此题中,使用map的思路就是,首先看是否能够find到target-nums[i]的值,如果能找到,就说明在nums中存在两个数字满足题意,那么直接返回两者的对应下标即可,也就是i,和r[key];如果找不到target-nums[i],那么就初始化map的键值对,这里可能乍一看怎么没有初始化map,其实不然,每一次没有找到就会初始化一个值,这样效率最高。例如:实例中的例子,一开始的key=9-2=7,map此时为空,所以找不到,那么初始化r[2]=0,然后再循环key=9-7=2,刚好有2,然后就可以返回下标i=1,r[2]=0,完毕。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int>r;
int i=0;
for(i=0;i<nums.size();i++)
{
int key=target-nums[i];
if(r.find(key)!=r.end())
{
return vector<int>({i,r[key]});
}
r[nums[i]] = i;
}
}
/*
vector<int> result;
for (int i = 0; i < nums.size(); i++)
{
for (int j = i + 1; j < nums.size(); j++)
{
if (nums[i] + nums[j] == target)
{
result.push_back(i);
result.push_back(j);
return result;
}
}
}*/
};
执行用时:8 ms