【LeetCode】哈希表精选5题

目录

1. 两数之和(简单)

2. 验证外星语词典(简单)

3. 存在重复元素(简单)

4. 存在重复元素 II(简单)

5. 字母异位词分组(中等)


1. 两数之和(简单)

创建一个哈希表,对于每一个nums[i],我们首先查询哈希表中是否存在target - nums[i],然后将nums[i]插入到哈希表中,即可保证不会让nums[i]和自己匹配。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int n = nums.size();
        unordered_map<int, int> hash; // key——nums[i] value——i
        for (int i = 0; i < n; i++)
        {
            int x = target - nums[i];
            if (hash.count(x))
                return { hash[x],i };
            hash[nums[i]] = i;
        }
        return { -1,-1 };
    }
};

2. 验证外星语词典(简单)​​​​​​​

用数组模拟哈希表,hash[0]表示字母'a'在字母表中的顺序,hash[1]表示字母'b'在字母表中的顺序……

为了判断两个单词是否是按照字母表的顺序排序的,可以扫描两个单词中的字母找出第一个不相同的字母。哪个单词的第一个不相同的字母在字母表中的位置靠前,排序的时候它就排在前面。如果没有找到不相同的字母,那么短的单词在排序的时候应该排在前面。

class Solution {
public:
    bool isAlienSorted(vector<string>& words, string order) {
        // 初始化哈希表
        for (int i = 0; i < order.size(); i++)
        {
            hash[order[i] - 'a'] = i;
        }
        // 判断相邻的两个单词是否按照字母表的顺序排序
        for (int i = 0; i < words.size() - 1; i++)
        {
            if (!isSorted(words[i], words[i + 1]))
                return false;
        }
        return true;
    }

private:
    bool isSorted(string& word1, string& word2)
    {
        int i = 0;
        while (i < word1.size() && i < word2.size())
        {
            char ch1 = word1[i];
            char ch2 = word2[i];
            if (ch1 == ch2)
            {
                i++;
            }
            else
            {
                if (hash[ch1 - 'a'] < hash[ch2 - 'a'])
                    return true;
                if (hash[ch1 - 'a'] > hash[ch2 - 'a'])
                    return false;
            }
        }
        return i == word1.size();
    }

    int hash[26]; // 记录字母在字母表中的顺序
};

3. 存在重复元素(简单)

出现至少两次就是数组中存在着重复的元素,因此我们可以无需统计元素出现的数目。仅需在遍历数组的过程中,检查当前元素是否在之前已经出现过即可。

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_set<int> hash;
        for (auto& e : nums)
        {
            if (hash.count(e))
                return true;
            else
            {
                hash.insert(e);
            }
        }
        return false;
    }
};

4. 存在重复元素 II(简单)

创建一个哈希表,对于每一个nums[i],我们首先查询哈希表中是否存在nums[i],并且i - hash[nums[i]] <= k,然后将nums[i]插入到哈希表中,即可保证不会让nums[i]和自己匹配。

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

5. 字母异位词分组(中等)

把一组字母异位词映射到同一个单词,由于互为字母异位词的单词的字母出现的次数分别相同,因此如果把单词中的字母排序就会得到相同的字符串。

创建一个哈希表,key为把单词字母排序得到的字符串,value为一组字母异位词。

例如,eat tea ate -> aet,创建哈希表,key——"aet",value——{ "eat","tea","ate" }。

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string, vector<string>> hash;
        for (string& str: strs)
        {
            string s = str;
            sort(s.begin(), s.end());
            hash[s].push_back(str);
        }
        vector<vector<string>> ans;
        for(auto& [x, y] : hash)
        {
            ans.push_back(y);
        }
        return ans;
    }
};

相关推荐

  1. LeetCode精选5

    2024-01-20 07:04:03       39 阅读
  2. Leetcode(一)

    2024-01-20 07:04:03       13 阅读
  3. 每日一(LeetCode)------三数之和

    2024-01-20 07:04:03       41 阅读
  4. LeetCode每日一 同构字符串()

    2024-01-20 07:04:03       30 阅读
  5. 5/9--两数之和

    2024-01-20 07:04:03       8 阅读
  6. LeetCode:169.多数元素(

    2024-01-20 07:04:03       38 阅读
  7. leetcode 相关题目

    2024-01-20 07:04:03       38 阅读
  8. leetcode】hot100

    2024-01-20 07:04:03       6 阅读
  9. Redis源码精读

    2024-01-20 07:04:03       34 阅读
  10. 数据结构5:

    2024-01-20 07:04:03       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-20 07:04:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-20 07:04:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-20 07:04:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-20 07:04:03       18 阅读

热门阅读

  1. 1.19 力扣中等图论

    2024-01-20 07:04:03       35 阅读
  2. JVM的即时编译(JIT)优化原理:加速程序的执行

    2024-01-20 07:04:03       28 阅读
  3. 网络 - 网速很慢一定是网不好引起的吗?

    2024-01-20 07:04:03       33 阅读
  4. UDP协议

    UDP协议

    2024-01-20 07:04:03      32 阅读
  5. MySQL Interview Speedrun

    2024-01-20 07:04:03       29 阅读
  6. Linux系统安装ffmpeg & 升级ffmpeg

    2024-01-20 07:04:03       40 阅读
  7. 【通知】我的教学文章《Rust跟我学》已全部上线

    2024-01-20 07:04:03       41 阅读