写在前面:
因着算法课每周作业采用了leetcode这个平台,据说是个很棒的平台,以前也有听说。
而我是第一次使用,注册完平台推荐的第一道题便是two sum,第一周以这个简单开始吧!
题意解读:
给定一个不定数量以及无序的整数数组和一个整数结果,从这个数组中找到两个数的之和等于这个结果,返回这两个数在原数组中的索引。
解题思路:
一开始看到题目就想用简单的两层循环暴力破解,但想想复杂度为O(n²)应该过不了,做了也没意义。
之前看过类似的题目,是用哈希表做出来的,如果用python写的话,相对简单。
由于期末考试要求用C/C++,有一段时间没用了C了,想找找感觉就还是按照要求来吧。
考虑到C++自己实现hashtable好复杂,为快速实现,用了Map代替。
正解思路是循环数组一次,每次判断当前数组索引位置的值在不在哈希表里,不在的话就加进去,key为数组的数值,value 为它的索引值。
在里面的话就取它的key记为n,接下来在哈希表里查找(target-当前数值),找到了就结束。
因为哈希表查找元素的时间复杂度为常数,前面也只用了一层循环,所以复杂度大大优化为O(n)。
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i, sum;
vector<int> results;
map<int, int> hashMap;
for (int i = 0; i < nums.size(); ++i)
{
/* code */
if (!hashMap.count(nums[i]))
{
/* code */
hashMap.insert(pair<int, int>(nums[i], i));
}
if (hashMap.count(target - nums[i]))
{
/* code */
int n = hashMap[target - nums[i]];
if (n < i)
{
/* code */
results.push_back(n);
results.push_back(i);
return results;
}
}
}
return results;
}
};
运行结果: