leetcode 1.两数之和
这个作为第一道题。暴力解法还是很简单的。
快速的解法是建立字典,用O(n)的空间代价将时间代价从O(n^2)下降到O(n)。
我是用c++实现。这里需要注意,在对顺序性没有要求,并且需要更好的查找性能的时候,推荐使用unordered_map而非map。
实现代码如下
class Solution { public: vector<int> twoSum(vector<int> &nums, int target) { int i, j = 0; unordered_map<int, int> V2Index; for (i = 0; i < nums.size(); i++) { V2Index[nums[i]] = i; } for (i = 0; i < nums.size(); i++) { auto search = V2Index.find(target - nums[i]); if (search != V2Index.end() && V2Index[target - nums[i]] != i) { vector<int> ans = {i, search->second}; return ans; } } vector<int> ans; return ans; } };
稍微一个小优化,不需要建立完整的字典后再去搜索,而是每插入一个键值对就搜索一次。从leetcode的测试结果来看,时间优化效果比改动前好很多。这是考虑到平均时间复杂度。
class Solution { public: vector<int> twoSum(vector<int> &nums, int target) { int i, j = 0; unordered_map<int, int> V2Index; for (i = 0; i < nums.size(); i++) { auto search = V2Index.find(target - nums[i]); if (search != V2Index.end() && V2Index[target - nums[i]] != i) { vector<int> ans = {i, search->second}; return ans; } V2Index[nums[i]] = i; } vector<int> ans; return ans; } };

浙公网安备 33010602011771号