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

news2024/11/15 13:27:11

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。哈希法是牺牲了空间换取了时间,要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。

当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就multiset。

而map 是一个key value 的数据结构,map中,对key是有限制,对value没有限制的。

242、有效的字母异位词

242、有效的字母异位词

介绍

给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:st 中每个字符出现的次数都相同,则称 st 互为字母异位词。

思路

暴力思路:两层for循环,一层for循环遍历字符串,另一个for循环遍历另一个字符串,看第一个for循环中的字符有没有出现过。

哈希法:数组(范围可控)、set(范围很大)、map(key--value)

本题中a-z中ASCII码是连续的。a可以对应到数组下标位0的位置,z可以对应到数据下表为25的位置。因此,可以定义一个数组hash[26];

用该数组统计第一个字符串里每个字符出现的频率。然后第二个字符串每个字符出现的频率在数组的基础上做减法。如果最后数组hash中的所有元素都为0,那么就是有效字母异位词。

//定义哈希数组,默认该数组中的值为0
int hash[26];
for(i=0;i<s.size;i++){
    hash[s[i]-'a']++;
}
for(i=0;i<t.size;i++){
    hash[t[i]-'a']--;
    }
for(i=0;i<26;i++){
    if(hash[i]!=0)
        return false;
}
return true;

代码

class Solution {
public:
    bool isAnagram(string s, string t) {
        int hash[26] = {0};
        for(int i=0;i<s.size();i++){
            hash[s[i]-'a']++;
        }
        for(int i=0;i<t.size();i++){
            hash[t[i]-'a']--;
        }
        for(int i=0;i<26;i++){
            if(hash[i]!=0)
                return false;
        }
        return true;
    }
};

349、两个数组的交集

349、两个数组的交集

介绍

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

思路一 数值很大使用set

若数值很大,可以使用set来做哈希映射。若数值很大,但是分布很分散,也可以用set。

将nums1数组放到哈希表里,然后遍历nums2的元素,查看每个元素是否在哈希表中出现,若出现,则放到新数组中,并且最后要去重。

set在C++中:

  • set

  • unordered_set(无限存装的数组) 做映射和取值操作时效率最高

  • multi_set

unordered_set result  (unordered_set会自动做去重)
unordered_set number_set(nums1) //直接把nums1数组转变为unordered_set存储结构
//使用num2在number_set中做遍历查询操作
for(i=0;i<nums2.size'i++){
    if(number_set.find(nums2[i]) != nums_set.end()) //如果找到了该元素
        result.inset(nums2[i])
}
return vector(result...)

思路二 数值较小使用数组

定义一个1005的数组

unordered_set result;
int hash[1005]={0}
//把nums1处理成哈希表结构
for(i=0;i<nums1.size;i++){
    hash[nums1[i]] =1;
}
//遍历nums2
for(i=0;i<nums2.size;i++){
    if(hash[nums2[i]] == 1)
        result.insert(nums2[i])
}

代码

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result;//unordered_set会自动去重
        unordered_set<int> nums_set(nums1.begin(),nums1.end());
        for(int i=0;i<nums2.size();i++){
            //find方法如果没找到该元素在哈希表中,则会返回end
            if(nums_set.find(nums2[i])!=nums_set.end())
                result.insert(nums2[i]);
        }
        return vector<int>(result.begin(),result.end());
    }
};
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result;//unordered_set会自动去重
        int hash[1005] = {0};
        //把nums1处理成哈希表结构
        for(int i=0;i<nums1.size();i++){
           hash[nums1[i]] = 1;
        }
        //遍历nums2
        for(int i=0;i<nums2.size();i++){
            if(hash[nums2[i]]==1)
                result.insert(nums2[i]);
        }
        return vector<int>(result.begin(),result.end());
    }
};

202、快乐数

202、快乐数

介绍

思路

  • 如何求一个数中每一位的平方和。

  • 明确无限循环的概念,即如果新的平方和在之前的计算中出现过(因此可以想到使用哈希表),那么这就算一个无限循环。

代码

class Solution {
public:

    int getSum(int n){
        int sum = 0;
        while(n){
            sum = sum + (n%10)*(n%10);
            n = n/10;
        }
        return sum;
    }
    bool isHappy(int n) {
        unordered_set<int> set;//定义存储每次的平方和
        while(1){
            int sum = getSum(n);
            if(sum == 1)
                return true;
            // 如果这个sum在set中出现过,那么就说明陷入无限循环,要立即跳出
            if(set.find(sum)!=set.end()){
                return false;
            }else{
                set.insert(sum);
            }
            n = sum;
        }
    }
};

1、两数之和

1、两数之和

介绍

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

思路

每当遇到要判断这个元素是否出现过的第一反应就应该是哈希法。

例如:如果遍历到3,就应该判断前面是否遍历过6。

如何判断是否遍历过?将遍历过的元素加入到一个集合里。每次遍历新元素x的时候,在这个集合里判断9-x是否出现过。

集合---采用一种哈希表的结构--由于不仅要找一个元素,还要知道这个元素在原数组中的下标,所以应该选用map结构。

map的key和value---思考我们查找的是什么,我们查找的是一个元素是否出现过,那么就应该将元素作为map中的key。(map能以很快的速度查找key【这里的元素】是否在map中出现过)

map在该题中是存放我们遍历过的元素。

//map--unordered_map(存和读效率最高)--multi_map
//首先定义一个map,要定义该map的key和value,用于存放遍历过的元素
unordered_map(int,int) map;
for(i=0;i<nums.size;i++){
    //查询每个元素是否在map中
    s = target - nums[i] //要查询的key
    iter = map.find(s);
    if(iter!=map.end()) //如果要查询的key在map中出现过
        return {iter->value,i};
    map.insert(nums[i],i);//把遍历过的元素加入到map中
}
return {};

代码

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中
            int s = target - nums[i];
            auto iter = map.find(s);
            if(iter!=map.end())
                return {iter->second,i};
            map.insert(pair<int,int>(nums[i],i));
        }
        return {};
    }
};

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

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

相关文章

【SpringCloud】SpringCloud教程之Nacos实战(1)

目录Nacos是什么&#xff1f;一.Nacos下载二.安装Nacos三.Nacos原理四.Nacos快速入门五.Nacos服务多级存储模式六.Nacos根据集群设置负载均衡1.根据同集群优先访问2.根据权重配置负载均衡七.Nacos的环境隔离八.Nacos和Eureka的区别前提&#xff1a;以订单服务和用户服务为例&am…

【C++基础入门】数组、函数

一&#xff1a;数组 1.1 概述 所谓数组&#xff0c;就是一个集合&#xff0c;里面存放了相同类型的数据元素 特点1&#xff1a; 数组中的每个数据元素都是相同的数据类型 特点2&#xff1a; 数组是由连续的内存位置组成的 1.2 一维数组 1.2.1 一维数组定义方式 一维数组…

世界那么大,你哪都别去了,来我带你了解CSS3 (二)

文章目录‍❤️‍&#x1f525;CSS文档流‍❤️‍&#x1f525;CSS浮动‍❤️‍&#x1f525;CSS定位‍❤️‍&#x1f525;CSS媒体查询‍❤️‍&#x1f525;CSS文档流 文档流是文档中可显示对象在排列时所占用的位置/空间。 例如&#xff1a;块元素自上而下摆放&#xff0c;内…

第一章---Pytorch快速入门---第一节---张量及运算

目录 1.1张量的数据类型 1.2 张量的生成 1.3 张量操作 1.4 张量的计算 一、张量 在高等数学中&#xff0c;单独的一个数是标量&#xff0c;而有序排列的一组数字是一个向量&#xff08;例如一个数组&#xff09;&#xff0c;向量组可以构成矩阵。向量是一维的&#xff0c;而…

Java——腐烂的橘子

题目链接 leetcode在线oj题——腐烂的橘子 题目描述 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方…

Python数据分析案例19——上市银行财务指标对比

我代码栏目都是针对基础的python数据分析人群&#xff0c;比如想写个本科毕业论文&#xff0c;课程论文&#xff0c;做个简单的案例分析等。过去写的案例可能使用了过多的机器学习和深度学习方法&#xff0c;文科的同学看不懂&#xff0c;可能他们仅仅只想用python做个回归或者…

Method breakpoints may dramatically slow down debugging 解决方案

项目无法启动了 简单介绍一下事情的过程&#xff1a;昨天在进行代码调试的时候&#xff0c;代码部分处理完成之后&#xff0c;启动debug模式的热部署准备测试一下逻辑&#xff0c;结果左下角提示我热部署失败&#xff0c;需要重新启动Tomcat才能再次调试&#xff0c;所以只得重…

spring之refresh流程-Java八股面试(六)

系列文章目录 第一章 ArrayList-Java八股面试(一) 第二章 HashMap-Java八股面试(二) 第三章 单例模式-Java八股面试(三) 第四章 线程池和Volatile关键字-Java八股面试(四) 第五章ConcurrentHashMap-Java八股面试(五) 动态每日更新算法题&#xff0c;想要学习的可以关注一下…

css中重难点整理(vertical-align)

一、vertical-align 在学习vertical-align的时候&#xff0c;可能会很困惑。即使网上有一大推文章讲veitical-align,感觉看完好像懂了&#xff0c;等自己布局的时候用到vertical-align的时候好像对它又很陌生。这就是我在布局的时候遇到的问题。 本来vertical-align就很不好理…

Spring——配置文件实现IOC和DI入门案例

现在先如图创建如下的Maven项目&#xff0c;在业务层和数据层分别写上对应的接口和实现类 在BookServiceImpl中创建一个BookDaoImpl对象&#xff0c;并调用里面的save()方法。 在测试类里面new一个bookservice的实现类&#xff0c;调用save()方法 输出如下图所示 要使用IOC容…

安全开发基础 -- DAST,SAST,IAST简单介绍

安全开发基础-- DAST&#xff0c;SAST&#xff0c;IAST 简介 DAST 动态应用程序安全测试&#xff08;Dynamic Application Security Testing&#xff09;技术在测试或运行阶段分析应用程序的动态运行状态。它模拟黑客行为对应用程序进行动态攻击&#xff0c;分析应用程序的反…

Windows 10 - Django + simpleui项目实战 - 详细总结 导入导出-权限修改-修改登录界面-数据库优化-js触发事件失效奇葩问题

目录对django框架的内置功能的修改导入导出模块超级用户权限修改了解修改登录界面方法安装mysqlclient 性能优化&#xff0c;比pymysql模块更好报错 django.db.utils.OperationalError: (2026, SSL connection error: unknown error number)静态文件管理js问题 - onchange 和 o…

微信小程序搭建流程

一、申请微信开发者账号虽然开发微信小程序可以使用工具提供的测试号&#xff0c;但是测试号提供的功能极为有限&#xff0c;而且使用测试号开发的微信小程序不能上架发布。因此说我们想要开发一个可以上架的微信小程序&#xff0c;首先必须要申请微信开发者账号。大家尽可放心…

2023年总结的web前端学习路线分享(学习导读)

如果你打开了这篇文章&#xff0c;说明你是有兴趣想了解前端的这个行业的&#xff0c;以下是博主2023年总结的一些web前端的学习分享路线&#xff0c;如果你也想从事前端或者有这方面的想法的&#xff0c;请接着往下看&#xff01; 前端发展前景 前端入门 巩固基础 前端工程…

深度学习J1周-ResNet50算法实战与解析_鸟类识别(CNN)

&#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&#xff08;版权归 *K同学啊* 所有&#xff09; &#x1f356; 作者&#xff1a;[K同学啊] 本周任务&#xff1a; ●1.请根据本文 TensorFlow 代码&#xff08;训练营内部阅读&#xff09;&#xff0c;编写…

EasyExcel3.x文件导入SpringBoot2

引入依赖<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.3</version></dependency>简单导出以导出用户信息为例&#xff0c;接下来手把手教大家如何使用EasyExcel实现导出功能&a…

华为OD机试题,用 Java 解【数字涂色】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

微软正式推出用于 WSL 的 D3D12 GPU 视频加速

导读在允许 WSL 使用 OpenGL、OpenCL 和 Vulkan API 进行 GPU 加速之后&#xff0c;微软又正式发布了针对 Linux 的 Windows 子系统 (WSL2) 的 Direct3D 12 GPU 视频加速支持。 在允许 WSL 使用 OpenGL、OpenCL 和 Vulkan API 进行 GPU 加速之后&#xff0c;微软又正式发布了针…

【java基础】泛型的通配符(extends,super,?)

文章目录基本概念通配符extends通配符super无限定通配符?总结基本概念 如果不使用通配符&#xff0c;那么我们在使用了泛型之后就不允许类型参数发生改变了&#xff0c;但是有了通配符就可以更加灵活的控制类型参数&#xff0c;类型参数可以发生改变。下面准备了3个类用于演示…

【MAC OS 命令行】Redis的安装、启动和停止。就是如此简单

目录Mac 安装 Redis使用 Homebrew 安装 Redis总结Mac 安装 Redis 使用 Homebrew 安装 Redis 如果没有安装 Homebrew&#xff0c;先安装 Homebrew 执行命令&#xff1a; 方法一、brew 官网的安装脚本 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homeb…