LeetCode Hot100---哈希篇

LeetCode-1.两数之和

1、题目描述

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

2、测试样例

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

3、代码

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> h; // 定义哈希表
        int n = nums.size();
        vector<int> ans;
        for(int i = 0;i < n;i ++)
        {
            int x = target - nums[i]; // 从前往后遍历,寻找哈希表中有没有目标值x
            auto it = h.find(x);
            if(it != h.end()) // 找到了x,记录答案
            {
                ans.push_back(it->second);
                ans.push_back(i);
                return ans;
            }
            h[nums[i]] = i; // 将当前值的下标存入哈希表
        }
        return ans;
    }
};

LeetCode-49. 字母异位词分组

1、题目描述

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

2、测试样例

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

3、代码

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> ans; 
        unordered_map<string,vector<string>> h;
        for(int i = 0;i < strs.size();i ++)
        {
            auto t = strs[i];
            sort(t.begin(),t.end()); // 将排序后的字符串作为哈希表的key
            h[t].push_back(strs[i]); // 加入哈希表
        }
        for(auto it = h.begin();it != h.end();it ++)
            ans.push_back(it->second); // 记录答案
        return ans;
    }
};

Leetcode-128. 最长连续序列

1、题目描述

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

2、测试样例

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

3、代码

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        int ans = 0;
        unordered_set<int> st(nums.begin(), nums.end()); // 把 nums 转成哈希集合
        for (int x : st) { // 遍历哈希集合
            
            // 寻找当前序列的起点,如果x的前面还有数字的话,说明x不是起点,继续寻找
            if (st.contains(x - 1)) continue;

            // x 是序列的起点
            int y = x + 1;

            while (st.contains(y)) { // 不断查找下一个数是否在哈希集合中
                y++;
            }
            
            // 循环结束后,y-1 是最后一个在哈希集合中的数
            ans = max(ans, y - x); // 从 x 到 y-1 一共 y-x 个数
        }
        return ans;
    }
};

你可能感兴趣的:(LeetCode,Hot,100,哈希算法,leetcode,算法,c++)