4.4刷题记录(哈希表)

news2025/4/9 20:20:45

1.242. 有效的字母异位词 - 力扣(LeetCode)

class Solution {
public:
    bool isAnagram(string s, string t) {
        unordered_map<char,int>cnt_s,cnt_t;
        for(int i=0;i<s.size();i++){
            cnt_s[s[i]]++;
        }
        for(int i=0;i<t.size();i++){
            cnt_t[t[i]]++;
        }
        if(cnt_s==cnt_t){
            return true;
        }
        return false;
    }
};

其中unorder_map判断是否相等的逻辑通过以下来实现

for (const auto& pair : map1) {
        // 在第二个 unordered_map 中查找当前键
        auto it = map2.find(pair.first);
        // 如果找不到键,或者键对应的值不相等,返回 false
        if (it == map2.end() || it->second != pair.second) {
            return false;
        }
    }

2.383. 赎金信 - 力扣(LeetCode)

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        unordered_map<char,int>cnt_r,cnt_m;
        for(int i=0;i<ransomNote.size();i++){
            cnt_r[ransomNote[i]]++;
        }
        for(int i=0;i<magazine.size();i++){
            cnt_m[magazine[i]]++;
        }
        for(const auto& item1 : cnt_r){
            auto item2=cnt_m.find(item1.first);
            if(item2==cnt_m.end()||item1.second>item2->second){
                return false;
            }
        }
        return true;
    }
};

注意比较大小的时候find查找的是first的值,判断second是否相等的时候一个是.一个是箭头

3.349. 两个数组的交集 - 力扣(LeetCode)

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        vector<int>answer;
        unordered_map<int,int>cnt1,cnt2;
        for(int i=0;i<nums1.size();i++){
            cnt1[nums1[i]]++;
        }
        for(int i=0;i<nums2.size();i++){
            cnt2[nums2[i]]++;
        }
        for(const auto& item1 : cnt1){
            auto item2=cnt2.find(item1.first);
            if(item2!=cnt2.end()){
                answer.push_back(item2->first);
            }
        }
        return answer;
    }
};

4.49. 字母异位词分组 - 力扣(LeetCode)

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        //首先进行排序
        unordered_map<string,vector<string>>cnt;
        for(string str:strs){
            string key=str;
            sort(key.begin(),key.end());
            cnt[key].push_back(str);
        }
        vector<vector<string>>ans;
        for(const auto& item :cnt){
            ans.push_back(item.second);
        }
        return ans;
    }
};

先排序然后将排序过后的放在一个vector,简单高效,值得学习

5.438. 找到字符串中所有字母异位词 - 力扣(LeetCode)

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        unordered_map<char,int>cnts,cntp;
        vector<int>ans;
        if(s.size()<p.size()){
            return ans;
        }
        for(int i=0;i<p.size();i++){
            cntp[p[i]]++;
            cnts[s[i]]++;
        }
        if(cntp==cnts){
            ans.push_back(0);
        }
        for(int i=p.size();i<s.size();i++){
            //现在删除左面的元素
            if(--cnts[s[i-p.size()]]==0){
                cnts.erase(s[i-p.size()]);
            }
            //增加右边的元素
            cnts[s[i]]++;
            if(cntp==cnts){
                ans.push_back(i-p.size()+1);
            }
        }
        return ans;
    }
};

6.350. 两个数组的交集 II - 力扣(LeetCode)

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        unordered_map<int,int>cnt1,cnt2;
        vector<int>answer;
        for(int i=0;i<nums1.size();i++){
            cnt1[nums1[i]]++;
        }
        for(int i=0;i<nums2.size();i++){
            cnt2[nums2[i]]++;
        }
        for(const auto& item1:cnt1){
            auto item2=cnt2.find(item1.first);
            if(item2==cnt2.end()){
                continue;
            }
            else{
                for(int i=0;i<min(item1.second,item2->second);i++){
                    answer.push_back(item1.first);
                }
            }
        }
        return answer;
    }
};

7.202. 快乐数 - 力扣(LeetCode)

第一种方法比较巧妙(借助快慢指针),第二种比较普遍(利用hash_set)。

class Solution {
public:
    int sumsqure(int n){
        int sum=0;
        while(n!=0){
            int a=n%10;
            sum+=a*a;
            n=n/10;
        }
        return sum;
    } 
    bool isHappy(int n) {
        int fast=n,slow=n;
        do{
            fast=sumsqure(fast);
            fast=sumsqure(fast);
            slow=sumsqure(slow);
        }while(fast!=slow);
        return fast==1;

    }
};
class Solution {
public:
    // 取数值各个位上的单数之和
    int getSum(int n) {
        int sum = 0;
        while (n) {
            sum += (n % 10) * (n % 10);
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n) {
        unordered_set<int> set;
        while(1) {
            int sum = getSum(n);
            if (sum == 1) {
                return true;
            }
            // 如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return false
            if (set.find(sum) != set.end()) {
                return false;
            } else {
                set.insert(sum);
            }
            n = sum;
        }
    }
};

8.1. 两数之和 - 力扣(LeetCode)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int>ans;
        unordered_map<int,int>cnt;
        for(int i=0;i<nums.size();i++){
            auto item = cnt.find(target-nums[i]);
            if(item!=cnt.end()){
                ans.push_back(i);
                ans.push_back(item->second);
                break;
            }
            cnt.insert(pair<int,int>(nums[i],i));
        }
        return ans;
    }
};

9.454. 四数相加 II - 力扣(LeetCode)

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        unordered_map<int,int>sum1,sum2;
        //1.首先存储nums1,nums2
        for(int i=0;i<nums1.size();i++){
            for(int j=0;j<nums2.size();j++){
                sum1[nums1[i]+nums2[j]]++;
            }
        }
        //2.进行求和
        int count=0;
        for(int i=0;i<nums3.size();i++){
            for(int j=0;j<nums4.size();j++){
                auto item=sum1.find(0-nums3[i]-nums4[j]);
                if(item!=sum1.end()){
                    count+=item->second;
                }
            }
        }
        //3.输出
        return count;
    }
};

10.15. 三数之和 - 力扣(LeetCode)

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        unordered_map<int, int> count; // 统计每个数字的出现次数
        set<vector<int>> ans_set; // 用于去重
        vector<vector<int>> ans; // 最终结果

        // 统计每个数字的出现次数
        for (int num : nums) {
            count[num]++;
        }

        // 遍历所有可能的两个数字组合
        for (const auto& [a, count_a] : count) {
            for (const auto& [b, count_b] : count) {
                int c = -(a + b); // 第三个数字

                // 检查第三个数字是否存在
                if (count.find(c) != count.end()) {
                    // 创建一个临时三元组
                    vector<int> triplet = {a, b, c};
                    sort(triplet.begin(), triplet.end()); // 排序以便去重

                    // 检查是否满足条件
                    if (a == b && b == c) { // a == b == c
                        if (count[a] >= 3) {
                            ans_set.insert(triplet);
                        }
                    } else if (a == b) { // a == b != c
                        if (count[a] >= 2 && count[c] >= 1) {
                            ans_set.insert(triplet);
                        }
                    } else if (b == c) { // a != b == c
                        if (count[b] >= 2 && count[a] >= 1) {
                            ans_set.insert(triplet);
                        }
                    } else if (a == c) { // b != a == c
                        if (count[a] >= 2 && count[c] >= 1) {
                            ans_set.insert(triplet);
                        }
                    } else { // a != b != c
                        if (count[a] >= 1 && count[b] >= 1 && count[c] >= 1) {
                            ans_set.insert(triplet);
                        }
                    }
                }
            }
        }

        // 将结果从集合转换为向量
        for (const auto& vec : ans_set) {
            ans.push_back(vec);
        }

        return ans;
    }
};

另一种方法:双指针法(此代码及其考虑去重问题,而且运用到了双指针。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        //1.使用双指针法
        sort(nums.begin(),nums.end());
        vector<vector<int>>answer;
        for(int i=0;i<nums.size();i++){
            if(nums[i]>0){
                return answer;
            }
            
            //首先对nums[i]去重
            if(i>0&&nums[i-1]==nums[i]){
                continue;
            }
            int left=i+1,right=nums.size()-1;
            while(left<right){
                if(nums[i]+nums[left]+nums[right]==0){
                    answer.push_back({nums[i],nums[left],nums[right]});
                    //接下来对left和right进行去重
                    while(left<right && nums[left]==nums[left+1]){
                        left++;
                    }
                    while(right>left && nums[right]==nums[right-1]){
                        right--;
                    }
                    left++;
                    right--;
                }
                else if(nums[i]+nums[left]+nums[right]>0){
                    right--;
                }
                else{
                    left++;
                }
            }
        }
        return answer;
    }
};

11.18. 四数之和 - 力扣(LeetCode)​​​​​​

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> ans;
        for (int i = 0; i < nums.size(); i++) {
            if(nums[i]>target&&nums[i]>=0){
                break;
            }
            if(i>0&& nums[i]==nums[i-1]){
                continue;
            }
            for (int j = i + 1; j < nums.size(); j++) {
                if(nums[i]+nums[j]>target&&(nums[i]+nums[j])>=0){
                    break;
                }
                if (j>i+1 && nums[j] == nums[j - 1]) {
                    continue;
                }
                int left = j + 1, right = nums.size() - 1;
                while (left < right) {
                    if ((long)nums[i] + nums[j] + nums[left] + nums[right] == target) {
                        ans.push_back({nums[i], nums[j],nums[left], nums[right]});
                        // 接下来对left和right进行去重
                        while (left < right && nums[left] == nums[left + 1]) {
                            left++;
                        }
                        while (right > left && nums[right] == nums[right - 1]) {
                            right--;
                        }
                        left++;
                        right--;
                    } else if ((long)nums[i]+nums[j] + nums[left] + nums[right] > target) {
                        right--;
                    } else {
                        left++;
                    }
                }
            }
        }
        return ans;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2329800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录回溯算法03

93.复原IP地址 本期本来是很有难度的&#xff0c;不过 大家做完 分割回文串 之后&#xff0c;本题就容易很多了 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;回溯算法如何分割字符串并判断是合法IP&#xff1f;| LeetCode&#xff1a;93.复原IP地址_哔哩哔…

批量改CAD图层颜色——CAD c#二次开发

一个文件夹下大量图纸&#xff08;几百甚至几千个文件&#xff09;需要改图层颜色时&#xff0c;可采用插件实现&#xff0c;效果如下&#xff1a; 转换前&#xff1a; 转换后&#xff1a; 使用方式如下&#xff1a;netload加载此dll插件&#xff0c;输入xx运行。 附部分代码如…

【内网安全】DHCP 饿死攻击和防护

正常情况&#xff1a;PC2可以正常获取到DHCP SERVER分别的IP地址查看DHCP SERCER 的ip pool地址池可以看到分配了一个地址、Total 253个 Used 1个 使用kali工具进行模拟攻击 进行DHCP DISCOVER攻击 此时查看DHCP SERVER d大量的抓包&#xff1a;大量的DHCP Discover包 此时模…

10种电阻综合对比——《器件手册--电阻》

二、电阻 前言 10种电阻对比数据表 电阻类型 原理 特点 应用 贴片电阻 贴片电阻是表面贴装元件&#xff0c;通过将电阻体直接贴在电路板上实现电路连接 体积小、重量轻&#xff0c;适合高密度电路板&#xff1b;精度高、稳定性好&#xff0c;便于自动化生产 广泛应用于…

剑指Offer(数据结构与算法面试题精讲)C++版——day6

剑指Offer&#xff08;数据结构与算法面试题精讲&#xff09;C版——day6 题目一&#xff1a;不含重复字符的最长子字符串题目二&#xff1a;包含所有字符的最短字符串题目三&#xff1a;有效的回文 题目一&#xff1a;不含重复字符的最长子字符串 这里还是可以使用前面&#x…

freertos韦东山---事件组以及实验

事件组的原理是什么&#xff0c;有哪些优点&#xff0c;为啥要创造出这个概念 在实时操作系统&#xff08;如 FreeRTOS&#xff09;中&#xff0c;事件组是一种用于任务间同步和通信的机制&#xff0c;它的原理、优点及存在意义如下&#xff1a; 事件组原理 数据结构&#xf…

架构师面试(二十六):系统拆分

问题 今天我们聊电商系统实际业务场景的问题&#xff0c;考查对业务系统问题的分析能力、解决问题的能力和对系统长期发展的整体规划能力。 一电商平台在早期阶段业务发展迅速&#xff0c;DAU在 10W&#xff1b;整个电商系统按水平分层架构进行设计&#xff0c;包括【入口网关…

Java中的同步和异步

一、前言 在Java中&#xff0c;同步&#xff08;Synchronous&#xff09;和异步&#xff08;Asynchronous&#xff09;是两种不同的任务处理模式。核心区别在任务执行的顺序控制和线程阻塞行为。 二、同步&#xff08;Synchronous&#xff09; 定义&#xff1a;任务按顺序执行…

在 Ubuntu24.04 LTS 上 Docker Compose 部署基于 Dify 重构二开的开源项目 Dify-Plus

一、安装环境信息说明 硬件资源&#xff08;GB 和 GiB 的主要区别在于它们的换算基数不同&#xff0c;GB 使用十进制&#xff0c;GiB 使用二进制&#xff0c;导致相同数值下 GiB 表示的容量略大于 GB&#xff1b;换算关系&#xff1a;1 GiB ≈ 1.07374 GB &#xff1b;1 GB ≈ …

NO.64十六届蓝桥杯备战|基础算法-简单贪心|货仓选址|最大子段和|纪念品分组|排座椅|矩阵消除(C++)

贪⼼算法是两极分化很严重的算法。简单的问题会让你觉得理所应当&#xff0c;难⼀点的问题会让你怀疑⼈⽣ 什么是贪⼼算法&#xff1f; 贪⼼算法&#xff0c;或者说是贪⼼策略&#xff1a;企图⽤局部最优找出全局最优。 把解决问题的过程分成若⼲步&#xff1b;解决每⼀步时…

瑞萨RA4M2使用心得-KEIL5的第一次编译

目录 前言 环境&#xff1a; 开发板&#xff1a;RA-Eco-RA4M2-100PIN-V1.0 IDE&#xff1a;keil5.35 一、软件的下载 编辑瑞萨的芯片&#xff0c;除了keil5 外还需要一个软件&#xff1a;RASC 路径&#xff1a;Releases renesas/fsp (github.com) 向下找到&#xff1a; …

数据分析-Excel-学习笔记

Day1 复现报表聚合函数&#xff1a;日期联动快速定位区域SUMIF函数SUMIFS函数环比、同比计算IFERROR函数混合引用单元格格式总结汇报 拿到一个Excel表格&#xff0c;首先要看这个表格个构成&#xff08;包含了哪些数据&#xff09;&#xff0c;几行几列&#xff0c;每一列的名称…

整车CAN网络和CANoe

车载网络中主要包含有Can网络,Lin网络,FlexRay,Most,以太网。 500kbps:500波特率,表示的数据传输的速度。表示的是最大的网速传输速度。也就是每秒 500kb BodyCan车身Can InfoCan娱乐信息Can 车身CAN主要连接的是ESB电动安全带 ADB自适应远光灯等 PTCan动力Can 底盘Can

ChatGPT 的新图像生成器非常擅长伪造收据

本月&#xff0c;ChatGPT 推出了一种新的图像生成器&#xff0c;作为其 4o 模型的一部分&#xff0c;该模型在生成图像内的文本方面做得更好。 人们已经在利用它来生成假的餐厅收据&#xff0c;这可能会为欺诈者使用的已经很广泛的 AI 深度伪造工具包添加另一种工具。 多产的…

JS页面尺寸事件

元素位置 在这里插入图片描述 父元素带有定位时输出相对于父亲元素的距离值

网络协议之基础介绍

写在前面 本文看下网络协议相关基础内容。 1&#xff1a;为什么要有网络协议 为了实现世界各地的不同主机的互联互通。 2&#xff1a;协议的三要素 协议存在的目的就是立规矩&#xff0c;无规矩不成方圆嘛&#xff01;但是这个规矩也不是想怎么立就怎么立的&#xff0c;也…

初识数据结构——Java集合框架解析:List与ArrayList的完美结合

&#x1f4da; Java集合框架解析&#xff1a;List与ArrayList的完美结合 &#x1f31f; 前言&#xff1a;为什么我们需要List和ArrayList&#xff1f; 在日常开发中&#xff0c;我们经常需要处理一组数据。想象一下&#xff0c;如果你要管理一个班级的学生名单&#xff0c;或…

uniapp微信小程序引入vant组件库

1、首先要有uniapp项目&#xff0c;根据vant官方文档使用yarn或npm安装依赖&#xff1a; 1、 yarn init 或 npm init2、 # 通过 npm 安装npm i vant/weapp -S --production# 通过 yarn 安装yarn add vant/weapp --production# 安装 0.x 版本npm i vant-weapp -S --production …

贪心进阶学习笔记

反悔贪心 贪心是指直接选择局部最优解&#xff0c;不需要考虑之后的影响。 而反悔贪心是在贪心上面加了一个“反悔”的操作&#xff0c;于是又可以撤销之前的“鲁莽行动”&#xff0c;让整个的选择稍微变得“理智一些”。 于是&#xff0c;我个人理解&#xff0c;反悔贪心是…

Java 大视界 -- Java 大数据在航天遥测数据分析中的技术突破与应用(177)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…