LeetCode 1. Two Sum
问题链接
题目解析
给定一数字数组及目标和,求数组中和为目标的两个数下标。
解题思路
暴力搜索肯定过不了,时间复杂度为 \(O(n^2)\),TLE教你做人。
本题利用map可以轻松过,怎么用呢?简单理解为map可以在两个对象之间建立联系,即(key, value)。
数组中的数字作为map的key,对应数组索引值作为value。由于问题求解为 \(x + y = target\),变个法子,\(x = target - y\)。遍历一遍数组,判断(target - nums[i])是否出现过,由于题目说明只有一种解法,所以一旦判断通过,即可返回答案。时间复杂度为 \(O(n)\)。
小tip:注意这里一遍遍历时建立map数据,没有必要把所有数据加入map,也可以省去不少时间。
unordered_map 和 map 并无太大区别,C++11中的新容器,一个无序一个有序罢了,在不同情况下各有优势。这里只需要判断存在,所以选择无序的unordered_map即可。
unordered_map::count - C++ Reference
unordered_map::find - C++ Reference
参考代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> m;
for (int i = 0; i < nums.size(); ++i) {
if (m.count(target - nums[i])) {
return {m[target - nums[i]], i};
}
m[nums[i]] = i;
}
return {};
}
};
相似题目
LeetCode 15. 3Sum
LeetCode 16. 3Sum Closest
LeetCode 18. 4Sum
LeetCode All in One题解汇总(持续更新中...)
本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.