今天得到高人指点迷津。故从今天开始刷题,先来第一题体验一下。

PROBLEM

1.两数之和

难度 简单

MY ANSWER

暴力

两个for搞定,时间复杂度O(n^2),空间复杂度O(1)。

class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int a,b;
vector<int> tmp;
for(int i = 0; i < nums.size(); i++) {
for(int j = i + 1; j < nums.size(); j++) {
if(nums[i] + nums[j] == target) {
a = i;
b = j;
tmp.push_back(a);
tmp.push_back(b);
return tmp;
}
}
}
return tmp;
}
};

BETTER SOLUTION

哈希表

空间换时间,对于每一个 x,首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中。

class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hashtable;
for (int i = 0; i < nums.size(); ++i) {
auto it = hashtable.find(target - nums[i]);
if (it != hashtable.end()) {
return {it->second, i};
}
hashtable[nums[i]] = i;
}
return {};
}
};

时间复杂度O(n),空间复杂度O(n)。

SUMMARY

热手题目,太久没写,哈希表都没想出来。牢记:空间换时间,查询可以通过哈希表来降低复杂度,解题时多注意数据结构的设计。另外发现自己对STL了解不多,得多学习熟悉一下加快打码速度,毕竟写了快两年C,CPP快忘光了。