代码随想录算法训练营第六天|242.有效的字母异位词 、349. 两个数组的交集 、202. 快乐数、1. 两数之和

news2024/11/24 17:20:44

哈希表的表示方式:数组、set、map
数组:范围可控的情况下,可以用数组
set:哈希值较大的情况下,或数值分布很分散的情况
map:key 和 value对应的情况下
能用数组尽量用数组,因为数组会比较快!set、map的结构更复杂,浪费时间多

有效的字母异位词

题目链接:力扣

解题思路:第一种,类似于暴力遍历;第二种巧用数组构成哈希表,由于题目所给的都是小写字母,所以可以构建一个大小为26的数组,对应着a~z,当字符串s中出现某一字符时,在数组相应位置++,当字符串t中出现某一字符时,在数组相应位置--;最后检查数组中各元素是否为0,若不为0,则说明不是有效的字母异位词

暴力解法:

    bool isAnagram1(string s, string t) {

        if(s.size() != t.size())
        return false;

        unordered_map<char,int> mymap;            //key是字符,int是出现次数
        for(int i=0; i<s.size();i++)            
        {
            if(mymap.find(s[i]) == mymap.end())   //不存在 则插入
                mymap[s[i]] = 1;
            else                                  //存在,则该key值数量++
                mymap[s[i]]++;                   
        }
        for(int j=0; j<t.size();j++)
        {
            if(mymap.find(t[j]) == mymap.end())    //没找到
                 return false;
            else
                {
                    mymap[t[j]]--;                 //找到则对应key值数量--
                    if(mymap[t[j]] <= 0)           //若数量小于等于0
                      mymap.erase(t[j]);           //则将该key值从map中删除
                }
        }
        return true;
    }

数组哈希法:

bool isAnagram(string s, string t) {
         
         int Mymap[26] = {0};

         for(int i=0;i<s.size();i++)
             Mymap[s[i]-'a']++;

         for(int j=0;j<t.size();j++)
             Mymap[t[j]-'a']--;
    
         for(int i=0;i<26;i++)
         {
             cout<<i<<":"<<Mymap[i]<<endl;
             if(Mymap[i]!=0)
              return false;
         }
         return true;

     }

时间复制度O(n),空间复杂度O(1);

两个数组的交集

题目链接:力扣

知识点:哈希表最擅长的事情:给你一个元素,判断在某个集合中是否出现过。

解题思路:将num1转化为哈希表,将其所有放入哈希表中,再遍历num2的每一个元素是否在哈希表中出现过,若出现过,则最终放入result集合(result也是一个set,自带去重)中。最后将result转化为vector。
关于set的选择,这里采用unordered_set,因为其底层是哈希表(set和multiset底层是红黑树),其做映射的效率最高,做取值操作效率也最高。
代码如下:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> RES;
        unordered_set<int> N1(nums1.begin(),nums1.end()) ;

        for(int i=0;i<nums2.size();i++)
        {
            if(N1.find(nums2[i]) != N1.end())
                RES.insert(nums2[i]);
        }
        return vector<int>(RES.begin(),RES.end());
    }
};

快乐数

 题目链接:力扣

知识点:题目中提到,无限循环,也就是说求和的过程中,sum会重复出现 。
当快速判断一个元素是否出现集合里的时候,考虑哈希法。
这题还要掌握的是求和的过程。

附上我的代码,和卡哥思路类似:

 bool isHappy(int n) {
        
        int sum = 0;
        unordered_set<int> Res;
        Res.insert(n);
        while(1)
        {
            if(n == 1)
            return true;

             while(n)
            {
              int reminder = n % 10;
              sum += reminder * reminder;
              n = n/10;
            }

            if(Res.find(sum) == Res.end())  //没找到,不存在
             {
                 Res.insert(sum);
                 n = sum;  sum = 0;
             }
            else
             return false;

        }
     
     }

两数之和

题目链接:力扣

解题思路:将遍历过的元素加到集合里, 然后判断,我们想要寻找的元素是否在这个集合中出现过,若在这个集合里出现过,就是我们之前遍历过的。
同时我们还要知道这个元素出现的下标,即我们要存储两个元素,让数组做Key,下标做value,所以采用unordered_map。其中map用于存放遍历过的元素。

这道题,自己写的不太好,看完卡哥的解答,明晰了不少,下面贴上卡哥的代码:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map <int,int> map;
        for(int i = 0; i < nums.size(); i++) {
            // 遍历当前元素,并在map中寻找是否有匹配的key
            auto iter = map.find(target - nums[i]); 
            if(iter != map.end()) {
                return {iter->second, i};
            }
            // 如果没找到匹配对,就把访问过的元素和下标加入到map中
            map.insert(pair<int, int>(nums[i], i)); 
        }
        return {};
    }
};

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

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

相关文章

Netty内存管理

关键概念 PoolArena——内存管理的统筹者 PoolArena是内存管理的统筹者。它内部有一个PoolChunkList组成的链表 PoolChunkList——对PoolChunk的管理 PoolChunkList内部有一个PoolChunk组成的链表。通常一个PoolChunkList中的所有PoolChunk使用率(已分配内存/ChunkSize)都在…

机器学习算法分类

机器学习常用算法的分类&#xff1a; 根据数据集组成不同&#xff0c;可以把机器学习算法分为&#xff1a; 监督学习无监督学习半监督学习强化学习 1、监督学习 - 定义&#xff1a; - 输入数据是由输入特征值和目标值所组成 - 函数的输出可以是一个连续的值&#xff08;称为回…

【文本三剑客】AWK

AWK 一、AWK的工作原理1.1命令格式1.2awk常见的内建变量 二、awk实验2.1按行输入文本2.2按字段输出文本2.3通过管道符、双引号调用shell命令 一、AWK的工作原理 逐行读取文本&#xff0c;默认以空格或tab键为分隔符进行分隔&#xff0c;将分隔所得的各个字段保存到内建变量中&…

银行数字化转型导师坚鹏:银行数字化转型面临的5大机遇与4大挑战

在机遇方面&#xff0c;主要面临以下5大机遇&#xff1a; 国家战略及政策机遇&#xff1a;乡村振兴战略、制造强国战略、绿色金融战略等战略的落实将会给银行数字化转型带来新的业务机遇&#xff0c;《中国银保监会关于推动银行业和保险业高质量发展的指导意见》、《关于银行业…

第五章 面向对象-4abstract抽象

1.4 abstract class抽象类 声明抽象类&#xff0c;使用关键字abstract //内部匿名类 Db db new Db(){ };3.了解抽象类 抽象方法 AbstractClassMain.java /** Copyright (c) 2017, 2023, zxy.cn All rights reserved.**/ package cn.practice2;/*** <p>Description:&…

Chatgpt中文版无需代理,ChatGPT镜像

Chatgpt中文版无需代理 网站ChatGPT中文版 ChatGPT中文版是一个基于人工智能技术的聊天机器人&#xff0c;它可以模拟人类的自然语言交互&#xff0c;回答用户的各种问题和提供各种服务。它的核心技术是GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型&am…

基础:Android相关基础知识

目录 1.Android 四大组件 2.Activity生命周期 3.Service的生命周期 4.Service的启动方式 5.Activity的启动模式 6.广播的分类 7.ANR是什么&#xff0c;怎么避免&#xff1f; 8.Handler消息处理机制 9.事件分发机制 10.View绘制流程 11.Binder机制 12.进程间通信 1…

2023最新一键开通主机免费源码

更新了ui 自助开通主机&#xff0c;自己修改服务器 不带接口&#xff0c;不带接口&#xff0c;不带接口 打开api.php文件&#xff0c;把8.8.8.8改服务器ip&#xff0c;123456改成你的密钥 前往我的技术博客查看更多https://202271.xyz/?zhuji 蓝奏云链接 https://wwp.lanz…

如何在Linux中显示网络连接、路由表、接口统计等信息?Netstat了解一下!

Netstat 是一个用于显示网络连接、路由表、接口统计等信息的命令行工具。它在 Linux 和其他类 Unix 系统中都有提供&#xff0c;可以帮助我们分析和诊断网络问题。本文将介绍 Netstat 命令的基本用法和常见选项。 Netstat 命令的语法 Netstat 命令的基本语法如下&#xff1a; …

rtl仿真器-ghdl安装和测试

安装 sudo add-apt-repository ppa:pgavin/ghdl sudo apt-get update sudo apt-get install ghdl gtkwave仿真 rtl add.v library ieee; use ieee.std_logic_1164.all; entity ADD is port (A,B:in bit; SUM,CARRY:out bit); end entity ADD; architecture behave of ADD i…

前端部署vue项目到腾讯云服务器

先把dist包上传服务器 可以使用宝塔、FileZilla、手动上传等等方式 已有腾讯云服务器之后进入面板界面 然后安装Nginx 请一步一步&#xff0c;紧跟步骤 第一步 安装gcc-c 编译器。nginx依赖的 pcre 和 zlib 包 yum -y install gcc zlib zlib-devel pcre-devel openssl openss…

嵌入式通信协议【Modbus】Modbus功能码的详细描述

一、读功能码 1、 01 (0x01)读线圈 在一个远程设备中&#xff0c;使用该功能码读取线圈的 1 至 2000 连续状态。请求 PDU 详细说明了起始地址&#xff0c;即指定的第一个线圈地址和线圈编号。从零开始寻址线圈。因此寻址线圈 1-16 为 0-15。 根据数据域的每个比特将响应报文…

vs 推送代码 之 gitee

我们常常想将自己的代码放入到代码管理工具中&#xff0c;接下来我们将讲解如何去将vs中的代码放入到代码管理工具中 目的&#xff1a;将vs中的项目代码放入到gitee中 首先&#xff1a; 我们需要注册一下gitee的账号&#xff0c;官网&#xff1a;gitee官网 辅助工具&#xff…

做网络那么多年,连以太网接口和串口都分不清?本文值得一看!

路由器是一种网络设备&#xff0c;它的主要功能是在不同的网络之间转发数据包&#xff0c;实现网络互联。路由器根据数据包的目的地址&#xff0c;选择最佳的路径&#xff0c;将数据包发送到下一跳。路由器可以连接不同的网络类型&#xff0c;如以太网、帧中继、PPP等。 路由器…

JavaWeb_Mysql_多表设计与查询

JavaWeb_Mysql_多表设计与查询 多表设计外键约束物理外键 -- 不推荐逻辑外键 多表关系实现 多表查询数据准备内连接外连接子查询标量子查询列子查询行子查询表子查询 案例数据准备案例需求 来源 多表设计 外键约束 物理外键 – 不推荐 概念: 使用foreign key定义外键关联另外…

关于网络命令 ping 你了解多少

1、介绍 Ping(Packet Internet Groper)是 Windows、Unix 和 Linux系统下的一个命令。ping 也属于一个通信协议&#xff0c;是 TCP/IP 协议的一部分。   Ping的运作原理是向目标主机传出一个 ICMP&#xff08;Internet Control Messages Protocol&#xff09;即因特网信报控制…

Linux内核的源码目录结构和配置体系

1.linux内核源码目录结构1 1.1、源码从哪里来 (1)我们使用2.6.35.7版本的内核。这个版本的内核有三种&#xff1a;第一种是kernel.org上的官方版本&#xff0c;第二种是三星移植过的&#xff0c;第三种是九鼎X210的移植版本。这里使用第三个。 (2)进入源码目录下&#xff0c…

《QT+PCL》点云配准进阶——GROR配准

《QT+PCL》点云配准进阶——GROR配准 一、展示效果二、ui设计三、代码3.1添加代码一、展示效果 根据之前的文章GROR复现,今天将其集成到QT软件中 二、ui设计 三、代码 3.1添加代码 qt的头文件、源文件依旧添加相关代码 其中,如果有函数冲突,改成内联函数,添加inline<…

【系统移植】开发板的启动过程

目录 1、开发板启动相关部件 2、开发板启动过程&#xff08;以 EMMC 启动为例&#xff09; (1) 运行 BL0&#xff08;初始化&#xff09; (2) 加载 uboot 引导程序 (3) 加载 linux 镜像、设备树、根文件系统 3、SD卡的存储结构 1、开发板启动相关部件 下面是一个简单的开…

非常有用的Linux网络诊断命令:traceroute

简介 traceroute 是一个网络诊断工具&#xff0c;用于检测数据包从本机到目标主机经过的路由路径。它可以帮助我们分析出网络连接的瓶颈&#xff0c;定位网络问题&#xff0c;并帮助我们优化网络连接。在 Linux 系统中&#xff0c;traceroute 命令是一个非常常用的工具。 安装…