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

news2024/9/30 13:25:34

由于昨天是周日,周日是休息日,所以就是什么也没有写啦。今天是day06天,继续加油。

哈希表理论基础

建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。  

什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。  这句话很重要,大家在做哈希表题目都要思考这句话。 

数组也是一个哈希表。

那么哈希表能够解决什么问题?
哈希表可以解决的问题是能够判断一个元素是否存在集合之中。

例如:在一个学校之中,想要知道一个同学是否在这个学校之中,一般我们查询的复杂度是O(n),但是有了哈希表的存在,可以将查询的复杂度降低到O(1)。学生的姓名映射到一个表之中进行查询,就是一个哈希函数的过程。 

一.哈希函数

通过hashCode把名字转化为数值,一般hashcode是通过特定编码方式,可以将其他数据格式转化为不同的数值,这样就把学生名字映射为哈希表上的索引数字了。

二.哈希碰撞 

如上面的这个图所示,在进行一个映射的时候,如果要是学生姓名过多的时候,会出现超出hashsize的情况,进行取模操作,但是还是会存在一个hash位置存在多个姓名的情况,这个问题我们称之为hash碰撞。

解决hash碰撞的方式一般是有两个:
(1)拉链法:在进行到hash碰撞的地方,使用一个链表将碰撞的位置的同学添加到一起。拉链法的使用要注意使用合适大小的数组,这样就是可以避免数组的浪费,同时还可以减少链表的长度。 

 (2)线性探针法

使用线性探测法,一定要保证tableSize大于dataSize。 我们需要依靠哈希表中的空位来解决碰撞问题。

三.常见的hash结构 

数组、集合(set)、映射(map)

std::set / map和std::multiset / multimap 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。

哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。

242.有效的字母异位词 

建议: 这道题目,大家可以感受到 数组 用来做哈希表 给我们带来的遍历之处。

题目链接:力扣

本题的解题思路:首先是判断一个使用什么样的数据结构,一般的hash问题是存在三个hash结构。本题之中的字符的小写字母是连续的。

使用范围:在hash值比较小,范围可控使用数组;如果范围很大,使用set;带有value使用map。

class Solution {
public:
    bool isAnagram(string s, string t) {

        //本题是使用ASCLL进行相应的计算
        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++)//注意这个地方需要赋值的地方是26,否则会存在错误
        {
            if(hash[i] != 0)
            {
                return false;
            }
        }

        return true;
    }
};

349. 两个数组的交集 

建议:本题就开始考虑 什么时候用set 什么时候用数组,本题其实是使用set的题,但是后来力扣改了题目描述和 测试用例,添加了 0 <= nums1[i], nums2[i] <= 1000 条件,所以使用数组也可以了,不过建议大家忽略这个条件。 尝试去使用set。

题目链接:力扣

本题的思路是进行一个交集的计算过程,是进行去重的。这个题如果要是数值是非常大的情况,可以使用set。比如:[0,1,10000]如果要是使用数组就过于大了。
hash表最擅长解决给你一个元素,这个元素是否在集合之中出现过。
首先将一个数组变成unorder_set multiset set,underset是hash表情况,做映射的情况时,效率是最高的。由于要进行去重,因此使用underset是非常必要的。

使用unordered_set方式:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {

            //首先声明一个unorder_set数组,用于存在nums1
            unordered_set<int> num111(nums1.begin(),nums1.end());

            //声明一个unordered_set数组,用来存放新的
            unordered_set<int> result;

            for(int num:nums2)
            {
                if(num111.find(num) != num111.end())//说明是找到了
                {
                    result.insert(num);
                }
            }

            return vector<int> (result.begin(),result.end());

    }
};

使用数组方式:首先将nums1之中的东西都是变成为1,然后遍历nums2,看看是否二者都是存在这个数组的,如果要是存在的话,需要将其插入到新的数组之中.

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {

         
            //声明一个unordered_set数组,用来存放新的,可以实现去重的操作
            unordered_set<int> result;

            //声明一个数组,将nums1之中的东西都放入进去
            int nums111[10000] = {0};

            for(int num:nums1)
            {
                 nums111[num]=1;//注意:这个地方必须是=1,不是++,因为有些地方初始的时候是空的.
            }

            for(int num:nums2)
            {
                 if(nums111[num] == 1)
                 {
                     result.insert(num);
                 }

            }

            return vector<int> (result.begin(),result.end());

    }
};

202. 快乐数 (一会儿看)

建议:这道题目也是set的应用,其实和上一题差不多,就是 套在快乐数一个壳子

题目链接:力扣

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;
        }
    }
};

1. 两数之和 

建议:本题虽然是 力扣第一题,但是还是挺难的,也是 代码随想录中 数组,set之后,使用map解决哈希问题的第一题。

题目链接:力扣

解题思路:本题要存放两个东西,一个是数组的元素,另外是一个下标,因此,本题使用<key,value>的方式进行存放.另一方面,查找的是key,这里将key的值使用元素放置.下标作为value存放.

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {

        //首先,声明一个map,用来存放数组与下标
        unordered_map<int,int> map;
        int i = 0;
        //遍历相应的nums数组
        for(int num:nums)
        {
            int s = target - num;

            if(map.find(s)!=map.end())//说明找到了
            {
                return {map.find(s)->second,i};
            }
            map.insert(pair<int,int>(num,i));
            i++;
        }
        return {};
    }
};

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

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

相关文章

Toolkit.getDefaultToolkit()获得的java.awt.Toolkit是不是同一个? 是否为单例设计模式?答案是**是**

Toolkit.getDefaultToolkit()获得的java.awt.Toolkit是不是同一个? 是否为单例设计模式? 答案是是 反复调用Toolkit.getDefaultToolkit()获得的 java.awt.Toolkit 是同一个 import java.awt.Toolkit;public class GetDefaultToolkit是不是获得单例Toolkit {static public …

【P43】JMeter 吞吐量控制器(Throughput Controller)

文章目录 一、吞吐量控制器&#xff08;Throughput Controller&#xff09;参数说明二、测试计划设计2.1、Total Executions2.2、Percent Executions2.3、Per User 一、吞吐量控制器&#xff08;Throughput Controller&#xff09;参数说明 允许用户控制后代元素的执行的次数。…

中级软件设计师考试总结

目录 前言考前学习宏观什么是软考涉及的知识范围软考整体导图总结 微观我的分享——希尔排序学习过程结构化做题 考试阶段确定不确定 考后总结 前言 作为一名中级软件设计师&#xff0c;考试是衡量自己技能和水平的一项重要指标。在备考和考试过程中&#xff0c;我通过总结经验…

【TI毫米波雷达笔记】IWR6843AOPEVM-G的DCA1000EVM模式配置及避坑(官方手册有误)

【TI毫米波雷达笔记】IWR6843AOPEVM-G的DCA1000EVM模式配置及避坑&#xff08;官方手册有误&#xff09; IWR6843AOPEVM-G版本可以直接与DCA1000EVM连接 进行数据获取 不需要连接MMWAVEICBOOST版 直接使用 DCA1000mmWave Studio 软件进行数据采集 在官方手册中 User’s Guide…

linux环境下安装gitlab

前几天跟朋友聊天时说到gitlab版本控制。其实&#xff0c;之前也对它只是知道有这个东西&#xff0c;也会用。只是对于它的安装和配置&#xff0c;那我还是没整过。这两天&#xff0c;我找了一下网上的资料&#xff0c;还是写下吧。 一安装&#xff1a; 按网上所说&#xff0c;…

2023年上半年信息系统项目管理师下午真题及答案解析

试题一(25分) 为实现空气质量的精细化治理&#xff0c;某市规划了智慧环保项目。该项目涉及网格化监测、应急管理、执法系统等多个子系统。作为总集成商&#xff0c;A公司非常重视&#xff0c;委派李经理任项目经理&#xff0c;对公司内研发部门与项目相关的各产品线研发人员及…

带你开发一个远程控制项目---->STM32+标准库+阿里云平台+传感器模块+远程显示-------之 阿里云平台项目建造。

第一篇章&#xff1a; (13条消息) 带你开发一个远程控制项目----&#xff1e;STM32标准库阿里云平台传感器模块远程显示。_海口飞鹏岛科技有限公司的博客-CSDN博客 本次文章是指引开发者进行开发阿里云平台建造设备项目&#xff0c;可观看UP主教程&#xff0c;完成如下&#x…

今天面了一个9个月测试经验的人,开口就跟我要18K,我都愣住了....

2月初我入职了深圳某家创业公司&#xff0c;刚入职还是很兴奋的&#xff0c;到公司一看我傻了&#xff0c;公司除了我一个测试&#xff0c;公司的开发人员就只有3个前端2个后端还有2个UI&#xff0c;在粗略了解公司的业务后才发现是一个从零开始的项目&#xff0c;目前啥都没有…

测试之路,你知道这些变化吗?突破后助你走得更远...

前言 Python自动化测试&#xff1a;7天练完这60个实战项目&#xff0c;年薪过35w。 目前的面试求职市场上&#xff0c;测试领域有哪些变化&#xff1f; 以这两年软件测试发展经历来看&#xff0c;现在的求职市场&#xff0c;已经不仅仅只考察个人的项目经验和技术能力了&#…

十五、多线程(上)

文章目录 一、线程&#xff08;一&#xff09;什么是线程&#xff08;二&#xff09;Linux下的多线程&#xff08;三&#xff09;总结&#xff08;四&#xff09;线程优点&#xff08;五&#xff09;线程缺点&#xff08;六&#xff09;线程异常&#xff08;七&#xff09;线程…

字节跳动测试开发岗 3+1 面经+经验分享(收到offer,入职月薪27K)

现在&#xff0c;招聘黄金时间已经过了&#xff0c;在网上看了很多大佬的面经&#xff0c;也加了很多交流群&#xff0c;受到了很多朋友的提点&#xff0c;今天终于轮到我来分享面经啦&#xff0c;之前面试了几家公司&#xff0c;最后在八月初拿到了字节跳动测试岗的 offer&…

数据结构 -- AVL树

1、定义 平衡搜索二叉树&#xff0c;相对于搜索二叉树而言&#xff0c;AVL树又多了一个性质&#xff1a;左右子树的高度差不大于1. 2、平衡因子&#xff0c;balance factor&#xff0c;以下简称bf&#xff0c;是左子树高度减去右子树的高度 bf > 1&#xff0c;左边子树高bf …

Java最新版发送阿里短信教程

一、概述&#xff1a; 为什么现在的企业越来越多使用阿里云短信服务&#xff0c;究其原因是阿里云短信服务是一种可靠、高效、安全的短信发送服务&#xff0c;它具有以下优点&#xff1a; 高可靠性&#xff1a;阿里云短信服务采用全球领先的短信网关进行短信发送&#xff0c;确…

自定义线程池

自定义线程池原理 线程池中分为核心线程和临时线程&#xff1b;首先创建核心线程使用&#xff0c;创建之后一直存在线程池&#xff0c;核心线程被占用并且队列任务已满&#xff0c;才会创建临时线程&#xff1b;临时线程使用超过自定义临时线程最大数时会触发自定义的任务拒绝策…

你猜,一个TCP连接能发多少HTTP请求?

又见面了&#xff0c;我的网工朋友 曾经有这么一道经典面试题&#xff1a;从 URL 在浏览器被被输入到页面展现的过程中发生了什么&#xff1f; 相信大多数准备过的同学都能回答出来&#xff0c;但是如果继续问&#xff1a; 收到的 HTML 如果包含几十个图片标签&#xff0c;这…

【Vue】学习笔记-slot插槽

slot插槽 <slot>插槽&#xff1a;让父组件可以向子组件指定位置插入html结构&#xff0c;也是一种组件间通信的方式&#xff0c;适用于父组件>子组件 分类&#xff1a;默认插槽、具名插槽、作用域插槽 使用方式 a.默认插槽 b.具名插槽 父组件指明放入子组件的哪个插…

Django从Models 10分钟定制一个Admin后台

简介 Django自带一个Admin后台, 支持用户创建,权限配置和所有模型的增删改查功能, 只需要一些简单的配置就可快速得到一个开箱可用的后台管理系统 操作步骤 1. 更改设置,使用中文/亚洲时区 修改项目下django_shop目录下的settings.py文件 修改以下三行 LANGUAGE_CODE zh-h…

深度学习AI编译器-LLVM简介

1、什么是LLVM LLVM是一个编译器框架。LLVM作为编译器框架&#xff0c;是需要各种功能模块支撑起来的&#xff0c;你可以将clang和lld都看做是LLVM的组成部分&#xff0c;框架的意思是&#xff0c;你可以基于LLVM提供的功能开发自己的模块&#xff0c;并集成在LLVM系统上&…

干货 | 出国留学申请必备的6种材料,速来!!!

Hello,大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 我们又见面啦~你还好吗&#xff1f; 这是喵君姐姐的第n篇诚意推送~ 01 为什么要留学&#xff1f; 想去看外面的世界&#xff1f;想要打破科研的壁垒&#xff1f;想去更好的平台提升自己&#xff1f…

Android进阶之路 - 存、取、读 本地 Json 文件

最近在开发中又开始加载一些本地的json数据源&#xff0c;回头看之前竟然没记录&#xff0c;赶紧记录一波 ~ 如何准备一个合格的json文件?AndoridStudio中如何存放json文件&#xff1f;如何读取本地Json文件数据源?Java 版本Kotlin 版本 如何准备一个合格的json文件? 准备一…