(一)LeetCode热题100——哈希

1. 两数之和

题目来源
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。

示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

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

2. 字母异位词分组

题目来源
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]

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

3. 最长连续序列

题目来源
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_map<int, int> hash;
        int ret = 0;
        for (auto & n : nums){
            int prev = hash.count(n - 1) ? hash[n - 1] : 0;
            int next = hash.count(n + 1) ? hash[n + 1] : 0;
            if (!hash.count(n)){
                hash[n] = prev + next + 1;
                // 更新边缘数据,边缘数据中间的数据肯定都已经被遍历过了
                hash[n - prev] = hash[n];
                hash[n + next] = hash[n];
            }
            ret = max(ret, hash[n]);
        }
        return ret;
    }
};

你可能感兴趣的:(#,LeetCode热题100,哈希算法,leetcode,散列表)