前言:这是我们大学社团给我们大一新生布置的每日一题任务,教学性不强。经典博客当做日记。
——作为该网站的第一题,居然不是普通的A+Bproblem!
首先读完题后我们看到数据范围:
2 <= nums.length <= 10^4
-10^9 <= nums[i] <= 10^9
-10^9 <= target <= 10^9
- 只会存在一个有效答案
我们应该很快就能想到用字典树解决这道题,所以快来学字典树吧。
因为数据高达10^9,所以用一个bool数组是解决这个问题看起来会很low,不过当我们看到数组长度不超过10^4有唯一解的时候,我们就能立即想到用map(如果学过了的话)去解决这个问题。
代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> m;
for(int i=0;i<int(nums.size());i++){
if(m[nums[i]])return {m[nums[i]]-1,i};
m[target-nums[i]] = i+1;
}
return {0,0};
}
};
非常的通俗易懂,至于为什么m[target-num[i]]要赋值为i-1最后用m[num[i]]的时候要-1,是因为为了让if语句能判断数组首项,懂的都懂,不懂的我也解释不了。
当然很暴力的用O(n^2)的方法没道理过不了,只是这个题目后面来了一句:
进阶:你可以想出一个时间复杂度小于
O(n2)
的算法吗?
气不过,所以整了个更简单的。