leetcode hot100 哈希表

初次写博客,如有缺漏谬误,还请大家批评指正。

博主近期刷了leetcode hot100题单,决定参考“费曼学习法”整理一遍,从第一个模块哈希表开始。

1.两数之和

解法一 暴力循环

暴力枚举数i和数j,判断i+j是否等于target,时间复杂度O(n²)。代码不放了。

解法二 哈希表

建哈希表存储每一个数(key)和对应的索引值(value),对于每一个数nums[i],寻找是否有对应的“另一半”——target-nums[i]。

如果找到了就直接存储索引,并返回答案。

否则先把nums[i]的索引i暂存进哈希表中,进行下一轮循环。

class Solution {
public:
    vector twoSum(vector& nums,int target){
       vector res;
       unordered_map map;
       int n=nums.size();
       for(int i=0;i

2.字母异位词分组

字母异位词中包含的字母一致,因此sort一遍之后各异位词是相同的。

考虑建立哈希表存储索引(sort后的key)和值(原始字符串),最后按索引分组记录答案。

class Solution {
public:
    vector> groupAnagrams(vector& strs) {
        unordered_map> map;
        int n=strs.size();
        for(int i=0;i> res;
        for(const auto& pair:map){
            res.push_back(pair.second);  
        }
        return res;
    }
};

3.最长连续序列

思想类似DP(最长上升子序列),但没有必要用DP实现。

首先对数组排序,引入maxv记录最终答案,len记录当前答案,然后分情况讨论:

(1)后一个数比前一个数大1,即满足条件:len++

(2)后一个数不等于前1个数,即后一个数比前一个数至少大2:更新maxv,len重置

class Solution {
public:
    int longestConsecutive(vector& nums) {
        if(nums.size()==0) return 0;
        sort(nums.begin(),nums.end());
        int maxv=0,len=1;  //每个字符串本身是长度为1的连续序列
        for(int i=0;i

 

你可能感兴趣的:(散列表,算法,leetcode)