当前位置: 首页 > article >正文

【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>>中。


http://www.kler.cn/a/382358.html

相关文章:

  • Linux 基本使用和程序部署
  • 在Visual Studio 2022中配置C++计算机视觉库Opencv
  • PingCAP TiDB数据库专员PCTA认证笔记
  • 3D架构图软件 iCraft Editor 正式发布 @icraftplayer-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
  • 写作词汇积累:纰漏、坎肩、颠三倒四、隔阂
  • 鸿蒙元服务从0到上架【第二篇】
  • 【大模型LLM面试合集】大语言模型架构_bert细节
  • [ DOS 命令基础 3 ] DOS 命令详解-文件操作相关命令
  • 三周精通FastAPI:27 使用使用SQLModel操作SQL (关系型) 数据库
  • 视图-数据库sqlserver
  • jmeter 性能测试步骤是什么?
  • 代码随想录训练营Day18 | 77. 组合 - 216.组合总和III - 17.电话号码的字母组合
  • Qml组件之Text
  • DGL库之dgl.function.u_mul_e(代替dgl.function.src_mul_edge)
  • 模拟实现strcat函数
  • 线程池核心参数有哪些
  • Vue 组件传递数据-Props(六)
  • Vue+Springboot 前后端分离项目如何部署?
  • 【FPGA】Verilog:理解德摩根第一定律: ( ̅A + ̅B) = ̅A x ̅B
  • 爬虫下载网页文夹
  • 【C++刷题】力扣-#697-数组的度
  • 【人工智能】Transformers之Pipeline(二十二):零样本文本分类(zero-shot-classification)
  • 7.2 设计模式
  • [WSL][桌面][X11]WSL2 Ubuntu22.04 安装Ubuntu桌面并且实现GUI转发(Gnome)
  • 【论文阅读】-- 多元时间序列聚类算法综述
  • Sigrity Power SI 3D-EM Full Wave Extraction模式如何进行S参数提取和观测3D电磁场和远场操作指导(一)