哈希:实现一种键(key)值(value)匹配。

哈希优势:弥补数组下标索引无意义和链表查找慢(O(n)复杂度)的不足,实现O(1)复杂度的查找。

242. 有效的字母异位词 - 力扣(LeetCode)

暴力解法:

 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;
        
    }

};

核心思想:引入哈希函数,将任意长度的“键”映射到一个固定范围的数组下标上,从而将查找问题转化为数组的随机访问问题。

349. 两个数组的交集 - 力扣(LeetCode)

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等。

posted on 2025-11-10 17:50  四月/  阅读(2)  评论(0)    收藏  举报