自学内容网 自学内容网

【LeetCode热题100】哈希表

这篇博客记录了几道哈希表相关的题目,包括两数之和、判定是否互为字符串重排、存在重复元素II、字母异位词分组。

//解法1
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {
        vector<int> ret;
        for(int i = 1 ; i < nums.size() ; i++)
        {
            for(int j = 0 ; j < i ; j++)
            {
                if(nums[i]+nums[j] == target)
                {
                    ret.emplace_back(i);
                    ret.emplace_back(j);
                    return ret;
                }
            }
        }
        return ret;
        
    }
};
//解法2
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {
        unordered_map<int,int> hash;
        for(int i = 0 ; i < nums.size() ; i++)
        {
            int tmp = target - nums[i];
            if(hash.count(tmp)) return {i,hash[tmp]};
            hash[nums[i]] = i;
        }
        return {-1,-1};
        
    }
};

题目分析:关于这道题,我们有两种思路:

思路1:暴力求解

我们从从头开始固定一个数,然后去前面找是否存在满足要求的数,也是是通过两层循环去遍历。但是这种解法的时间复杂度是O(N2)。

思路2:哈希表

从头开始固定一个数,然去取哈希表中去找是否存在满足要求的数,如果不存在,将其放在哈希表中,然后固定下一个数,再去哈希表中去找是否存在满足要求的数,依次类推。

class Solution {
public:
    bool CheckPermutation(string s1, string s2) 
    {
        if(s1.size() != s2.size()) return false;
        int hash[26] = {0};
        for(auto e : s1)
        {
            hash[e -'a']++;
        }
        for(auto e : s2)
        {
            hash[e - 'a']--;
            if(hash[e - 'a'] < 0) return false;
        }
        return true;
    }
};

题目分析:本题采用哈希表的方式解决,由于全为小写字母,那么就可以使用数组模拟哈希表。首先,如果两个string长度不相等,那么肯定不符合要求。我们只需要创建一个哈希表即可。先将第一个string的字母挨个放到哈希表中,然后再遍历第二个哈希表,找到相同字母后,对应字母自减,如果减为负数,那么肯定不符合要求,返回false。

class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) 
    {
        unordered_map<int,int> hash;
        for(int i = 0 ; i < nums.size() ; i++)
        {
            if(hash.count(nums[i]))
                if(i-hash[nums[i]] <= k) return true;
            hash[nums[i]] = i; 
        }
        return false;
    }
};

题目分析:和I一样,也是使用哈希表,遍历nums,并把遍历过的元素放到哈希表中,判断符不符合要求。

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) 
    {
        //1.先将所有字母异位词分组
        unordered_map<string,vector<string>> hash;
        for(auto& s : strs)
        {
            string tmp = s;
            sort(tmp.begin(),tmp.end());
            hash[tmp].push_back(s);
        }
        //2.再提取出来
        vector<vector<string>> ret;
        for(auto& [x,y] : hash)
        {
            ret.push_back(y);
        }
        return ret;
    }
};

题目分析:解决这道题分两步,第一步,先把所有字母异位词分组,使用哈希表这个容器,unordered<string,vector<string>>,键值string存放的是字符串排序完之后的字符串(比如,“eat”排序完之后是“aet”,那么把“aet”放入键值),val放的是对应真实字符串,把字符串数组遍历一遍后,第二步,对得到的哈希表进行遍历,把其val放入vector<vector<string>>中。


原文地址:https://blog.csdn.net/qq_48460693/article/details/143264792

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!