一道简单题引发的惨案,map完败于unordered_map
题面:
方法:
暴力破解
C++:时间复杂度 O(n2)
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 vector<int> ans(2); 5 int i, j; 6 for(i=0; i<nums.size(); i++) 7 { 8 for(j=i+1; j<nums.size(); j++) 9 { 10 if((nums[i]+nums[j]) == target) 11 { 12 ans[0] = i; 13 ans[1] = j; 14 break; 15 } 16 } 17 } 18 return ans; 19 } 20 };
java: 时间复杂度 O(n2)
1 class Solution { 2 public int[] twoSum(int[] nums, int target) { 3 int a[] = new int[2]; 4 int i, j; 5 for(i=0; i<nums.length; i++) 6 { 7 for(j=i+1; j<nums.length; j++) 8 { 9 if((nums[i]+nums[j]) == target) 10 { 11 a[0] = i; 12 a[1] = j; 13 break; 14 } 15 } 16 } 17 return a; 18 } 19 }
优化算法
java HashMap: 时间复杂度 O(n) hash查找,视为O(1)
1 class Solution { 2 public int[] twoSum(int[] nums, int target) { 3 HashMap<Integer, Integer> map = new HashMap<>();//定义哈希表,用来存储数组中的数字 4 for(int i=0; i<nums.length; i++) 5 { 6 int sub = target - nums[i]; 7 if(map.containsKey(sub)) 8 { 9 return new int[] {map.get(sub), i}; 10 } 11 map.put(nums[i], i); 12 } 13 throw new IllegalArgumentException("No two sum solution");//异常处理,关键 14 } 15 }
C++ map:时间复杂度O(n*log(n)) map红黑树查找O(log(n))
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 vector<int> res; 5 map<int, int> mp; 6 for(int i=0; i<nums.size(); i++) 7 { 8 if(mp.find(target - nums[i]) != mp.end()) 9 { 10 return vector<int> {i, mp[target - nums[i]]}; 11 } 12 mp.insert(pair<int, int> {nums[i], i}); 13 } 14 return res; 15 } 16 };
C++ unordered_map:时间复杂度O(n) hash查找O(1)
只需要将👆代码中map改为unordered_map即可大大降低查找复杂度
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 vector<int> res; 5 unordered_map<int, int> mp; 6 for(int i=0; i<nums.size(); i++) 7 { 8 if(mp.find(target - nums[i]) != mp.end()) 9 { 10 return vector<int> {i, mp[target - nums[i]]}; 11 } 12 mp.insert(pair<int, int> {nums[i], i}); 13 } 14 return res; 15 } 16 };