哈希:实现一种键(key)值(value)匹配。
哈希优势:弥补数组下标索引无意义和链表查找慢(O(n)复杂度)的不足,实现O(1)复杂度的查找。
暴力解法:
1 class Solution { 2 public: 3 bool isAnagram(string s, string t) { 4 vector<int> t_count(26, 0); 5 vector<int> s_count(26, 0); 6 for(int i=0;i<size(s);i++){ 7 s_count[s[i]-'a']++; 8 } 9 10 for( int j=0;j<size(t);j++){ 11 t_count[t[j]-'a']++; 12 } 13 14 for(int i=0;i<26;i++){ 15 if(s_count[i]!=t_count[i]) 16 { 17 return false; 18 } 19 20 } 21 return true; 22 } 23 };
哈希表
class Solution{ public: bool isAnagram(string s,string t){ int count[26]={0}; for(int i=0;i<size(s);i++){ count[s[i]-'a']++; count[t[i]-'a']--; } for(int i=0;i<26;i++) if(count[i]!=0) { return false; } return true; } };
核心思想:引入哈希函数,将任意长度的“键”映射到一个固定范围的数组下标上,从而将查找问题转化为数组的随机访问问题。
class Solution { public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { vector<int>result; for(int i=0;i<size(nums1);i++){ for(int j=0;j<size(nums2);j++) if(nums2[j]==nums1[i]){ result.push_back(nums1[i]);//可以运行但是解答错误 } } return result; } }; /*nums1={1,2,2},nums2={2,2} 输出为:2,2,2,2 正确输出为:2 尝试在内层循环加上break; 输出会变为:2,2 问题的关键在于输出的元素要是唯一的;所以要在输出之前增加一个去重处理*/ for(int i = 0; i < result.size(); i++) { for(int j = i + 1; j < result.size(); j++) { if(result[j] == result[i]) { result.erase(result.begin() + j); // 不能直接使用delete result[j],其一,因为vector使用erase进行删除;其二,vector 的 erase() 方法的参数是迭代器(iterator),不是下标索引,故使用erase(result.begin()+j); j--; // 调整索引 } } }
需要一个可以自动调整重复元素的数据类型,set登场!
set
一种关联容器,可以自动排序和去重。
在C++中,unordered_set 和 unordered_map都是哈希结构,它们提供了O(1)时间复杂度的查找、插入和删除操作。
class Solution { public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { unordered_set<int>result; for(int i=0;i<size(nums1);i++){ for(int j=0;j<size(nums2);j++) if(nums2[j]==nums1[i]){ result.insert(nums1[i]); } } return vector<int>(result.begin(),result.end());//set同样使用迭代器,需要迭代器的容器还包括vector、map、list等。
浙公网安备 33010602011771号