今天寫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)
