今天写leetcode的 Two Sum这题一开始使用vector容器,然后使用algorithm里的find函数进行查找,如下:
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> res; for(int i=0;i<nums.size();i++) { int left = target - nums[i]; auto dis=find(nums.begin(), nums.end(),left); if(dis!= nums.end()) { if(dis-nums.begin()==i) dis= find(dis+1, nums.end(),left); if(dis!= nums.end()) { res.push_back(i); res.push_back(dis-nums.begin()); break; } } } return res; } };
发现会时间超时。后来改成用unordered_map通过了
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 unordered_map<int, int> mapping; 5 vector<int> result; 6 for(int i=0; i<nums.size();i++) 7 { 8 mapping[nums[i]]= i; 9 } 10 for(int i=0;i<nums.size();i++) 11 { 12 int gap= target-nums[i]; 13 if(mapping.find(gap) !=mapping.end() &&mapping[gap]>i) 14 { 15 result.push_back(i); 16 result.push_back(mapping[gap]); 17 break; 18 } 19 } 20 return result; 21 } 22 };
通过比较这,发现差异在find的函数使用
map底层是红黑树实现的,因此它的find函数时间复杂度:O(logn)
而unordered_map底层是哈希表,因此它的find函数时间复杂度:O(l)
!!!!!!!注意map与unordered_map的区别!!!!
而algorithm里的find函数是顺序查找,复杂度为O(n)