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

news2024/11/20 14:28:02

哈希知识基础

文章链接:https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E5%93%88%E5%B8%8C%E8%A1%A8

242.有效的字母异位词

题目链接:https://leetcode.cn/problems/valid-anagram/description/

思路:简易的哈希表

设置一个数组,其实就是一个简单哈希表,大小为26 就可以了,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值。
这个数组用来记录字符串s里字符出现的次数,把字符映射到数组也就是哈希表的索引下标上。
只需要分别的遍历一下两个字符串,遍历第一个字符串的时候,对应的位置+1;遍历第二个字符串的时候,对应的位置-1。
最后检查一下,如果数组里有的元素不为0,说明一定是谁多了字符或者谁少了字符,return false
如果数组里所有的元素都为0,说明找到了,return true

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] a = new int[26];
        if(s.length()!=t.length())
            return false;
        
        for(int i=0;i<s.length();i++){
            a[s.charAt(i)-'a'] ++;
        }

        for(int i=0;i<t.length();i++){
            a[t.charAt(i)-'a'] --;
        }

        for(int count:a)
        {
            if(count!=0)
                return false;
        }
        return true;
    }
}

时间复杂度 O(n)
空间复杂度 O(1)

349. 两个数组的交集

题目连接:https://leetcode.cn/problems/intersection-of-two-arrays/description/

解法:使用HashSet

这道题目,主要要学会使用HashSet求解即可。
但是要注意,使用数组来做哈希的题目,是因为题目都限制了数值的大小。
而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。
而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> resSet = new HashSet<>();
        for(int val:nums1)
            set1.add(val);
        for(int val:nums2)
        {
            if(set1.contains(val))
                resSet.add(val);
        }

        // 方法1:直接转成数组
        // return resSet.stream().mapToInt(x->x).toArray();
        
        // 方法2:定义一个数组
        int[] arr = new int[resSet.size()];
        int j = 0;
        for(int val:resSet){
            arr[j++] = val;
        }
        return arr;
    }
}

时间复杂度 O(m+n)
空间复杂度 O(m+n) ,其中 m 和 n 分别是两个数组的长度。

202. 快乐数

题目连接:https://leetcode.cn/problems/happy-number/description/

解法:哈希法快速判断

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。
题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要。
还有一个难点就是求和的过程,如果对取数值各个位上的单数操作不熟悉的话,做这道题也会比较艰难。

class Solution {

    public int getSum(int n){
        int ans = 0;
        // 不能写n%10,假如是100就直接不执行了
        while(n >0){
            ans += (n%10)*(n%10);
            n = n/10;
        }
        return ans;
    }

    public boolean isHappy(int n) {
        int result = n;
        Set<Integer>set = new HashSet<>();
        // 循环
        // while(true){
        //     result = getSum(result);
        //     System.out.println(result);
        //     if(result==1)
        //         return true;
        //     else if(set.contains(result))
        //         return false;
        //     else
        //         set.add(result);
        // }

        // 第二种循环写法
        while(n!=1 && !set.contains(n)){
            set.add(n);
            n = getSum(n);
        }
        return n==1;
    }
}

时间复杂度:O(logn)
空间复杂度:O(logn)

1. 两数之和

题目连接:https://leetcode.cn/problems/two-sum/

解法:哈希法

这里很明显暴力的解法是两层for循环查找,时间复杂度是O(n^2)。
当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。
因为本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适。
再来看一下使用数组和set来做哈希法的局限。
(1)数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
(2)set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。
map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(也就是相加等于target)
map中的存储结构为 {key:数据元素,value:数组元素对应的下标}
在遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。
在这里插入图片描述

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2];
        Map<Integer,Integer>map = new HashMap<>();
        for(int i=0;i<nums.length;i++){
            int tmp = target-nums[i];
            if(map.containsKey(tmp))
            {
                res[0] = map.get(tmp);
                res[1] = i;
                return res; 
            }else{
                map.put(nums[i],i);
            }
        }
        return res;
    }
}

时间复杂度:O(n)
空间复杂度:O(n)

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

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

相关文章

cv 不能正常读取中文路径

之前一直以为是PyQT的getOpenFileNames方法不能读取中文路径的。多次尝试后发现不是&#xff0c;是OpenCV的问题。 self.selected_imgPaths, _ QtWidgets.QFileDialog.getOpenFileNames(self, "打开图片", "./pending_images", "*.jpg;;*.JPG;;*.png…

C语言——实用调试技巧

一、为什么漏洞叫bug 为什么漏洞的英文是bug&#xff0c;众所周知bug有虫子的意思&#xff0c;这其实有一个很有名的故事。 1947年&#xff0c;计算机科学的先驱格蕾丝霍普&#xff08;Grace Hopper&#xff09;和她的团队在使用哈佛大学的马克二电脑时&#xff0c;发现了一个…

为CT_P自动注册与CT_Run相关的方法

概述 在docx.oxml.text.paragraph模块中定义了CT_P段落对象元素类&#xff0c;但是CT_P中并未定义add_r等与CT_Run相关的方法。在不断探索源码逻辑的过程中&#xff0c;对这种自动为类注册合适的方法的功能进行了梳理——xmlchemy这个模块设计的真好&#xff01;&#xff01;&…

rust跟我学(一):模块编写与使用

在rust中,单元文件可以被称为模块。 以下内容,将以get_local_info为例,讲解mod在工程中的使用。 先看下图,network.rs是src文件夹里的一个文件,我们可以单独把这个文件理解成一个模块。Rust比较智能,它可以将文件名称直接理解成一个模块,这在go里面是做不到的。 Rust其实…

​​社交媒体与新闻:Facebook在信息传播中的作用

社交媒体已经成为我们获取和传播新闻的主要渠道之一&#xff0c;而Facebook作为社交媒体的巨头&#xff0c;在信息传播中扮演着举足轻重的角色。本文将深入探讨社交媒体对新闻传播的影响&#xff0c;聚焦于Facebook在这一领域的独特作用&#xff0c;以及这种作用对我们的新闻体…

2024北京智博会:共赴科技盛会,助力跨界融合与实体经济深度发展

2024年6月&#xff0c;一场备受瞩目的科技盛会将在北京亦创国际会展中心拉开帷幕。作为国内外科技交流的重要平台&#xff0c;2024北京智博会将汇集众多科技领域的精英和企业&#xff0c;共同探讨跨界应用、实体经济深度融合等议题&#xff0c;为推动科技强国发展注入新动力。 …

SSL之mkcert构建本地自签名

文章目录 1. 什么是SSL2. mkcert&#xff1a;快速生成自签名证书2.1 mkcert的工作流程如下&#xff1a;2.2 window 本地实现自签证书2.2.1 下载安装2.2.2 下载,生成本地 SSL2.2.3 生成 pem 自签证书,可供局域网内使用其他主机访问。2.2.4 使用-psck12 生成*.p12 文件 2.3 Sprin…

7.11、Kali Linux中文版虚拟机安装运行教程

目录 一、资源下载准备工作 二、安装教程 三、kali linux换源 四、apt-get update 报错 一、资源下载准备工作 linux 中文版镜像历史版本下载:http://old.kali.org/kali-images/ 大家可以自行选择版本下载&#xff0c;本人下载的是2021版本 二、安装教程 打开vmvare wokst…

修炼九阳神功——“函数”

目录 前言 1. 函数的概念 2. 库函数 2.1 标准库和头⽂件 2.2 库函数的使用方法 2.2.1 功能 2.2.2 头⽂件包含 2.2.3 实践 2.2.4 库函数⽂档的⼀般格式 3. 自定义函数 3.1 函数的语法形式 3.2 函数的举例 ​编辑 4. 形参和实参 4.1 实参 4.2 形参 4.3 实参和形…

【dc-dc】世微AP5127平均电流型LED降压恒流驱动器 双色切换的LED灯驱动方案

这是一款双色切换的LED灯方案&#xff0c;12-50V 降压恒流,输出&#xff1a;6V 2.5A ​ 这是一款PWM工作模式 , 高效率、 外围简单、内置功率管&#xff0c;适用于 输入的 高 精度降压 LED 恒流驱动芯片。输出大功率可 达 25W&#xff0c;电流 2.5A。 可实现全亮/半亮功能切换…

Ansible Filter滤波器的使用(二)

一、【说在前面】 Ansible Filter一般被称为滤波器或者叫过滤器。 这个东西初次听到以为是什么科学计算的东西&#xff0c;但是想来ansible不太可能有什么滤波操作&#xff0c;所以这个东西本质是一个数值筛选器&#xff0c;内置函数&#xff0c;本质是一个为了做区别化的工具…

“15个必备的自动化测试工具,助你构建2024年的自动化策略!“

以下为作者观点&#xff1a; 如何选择正确的自动化测试工具&#xff1f;自动化测试工具是旨在通过自动化测试脚本验证功能或非功能软件需求的应用程序&#xff0c;帮助加快发布速度、提高项目质量并强化成果。 自动化测试工具可以帮助开发测试人员轻松创建、运行和维护测试&a…

闲鱼宝库亮相!闲鱼商品详情关键词搜索电商API接口助你畅享无尽好货!

随着互联网的快速发展&#xff0c;电商平台的崛起已经改变了人们的购物习惯。而在众多电商平台中&#xff0c;闲鱼作为一款社区二手交易平台&#xff0c;一直备受用户喜爱。如今&#xff0c;闲鱼宝库正式亮相&#xff0c;为用户带来了更加全面、详细的商品详情关键词搜索电商AP…

两整数之和

题目链接 两整数之和 题目描述 注意点 不使用 运算符 和 - ​​​​​​​&#xff0c;计算并返回两整数之和-1000 < a, b < 1000 解答思路 需要用位运算来模拟加法&#xff0c;关键是要找到相加的和以及进位1的部分。如果不考虑进位的话&#xff0c;相加可以运用异…

Spring - 如何控制多个 AOP 切面执行顺序?

众所周知&#xff0c;Spring 声明式事务是基于 AOP 实现的&#xff0c;那么&#xff0c;如果我们在同一个方法自定义多个 AOP&#xff0c;我们如何指定他们的执行顺序呢&#xff1f; 三种解决方案 1、通过实现 org.springframework.core.Ordered 接口 Component Aspect S…

​LeetCode解法汇总83. 删除排序链表中的重复元素

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给定一个已排序的链表的头 head &#xf…

【论文笔记合集】卷积神经网络之深度可分离卷积(Depthwise Separable Convolution)

本文作者&#xff1a; slience_me 我看的论文地址&#xff1a;MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 内容 1. 标准卷积 假设输入为DFDFM&#xff0c;输出为输入为DFDFN&#xff0c;卷积核为DKDKM&#xff0c;共有N个卷积核进…

【AIGC入门一】Transformers 模型结构详解及代码解析

Transformers 开启了NLP一个新时代&#xff0c;注意力模块目前各类大模型的重要结构。作为刚入门LLM的新手&#xff0c;怎么能不感受一下这个“变形金刚的魅力”呢&#xff1f; 目录 Transformers ——Attention is all You Need 背景介绍 模型结构 位置编码 代码实现&…

51单片机学习总结(自学)

1、模块化编程 c语言模块化编程实现思路设计代码 具体的程序实现代码如下所示 1&#xff1a;程序的头文件 2&#xff1a;程序的函数文件 3&#xff1a;程序的主文件控制函数的实现 持续更新中......

算法部署过程中如何确保数据的安全?

在数字化时代&#xff0c;数据安全成为了企业和个人面临的一项主要挑战。随着技术的迅速发展&#xff0c;尤其在算法部署过程中&#xff0c;确保敏感数据的安全性变得更加复杂和关键。在这个背景下&#xff0c;软件加密和授权机制的作用显得尤为重要。软件加密不仅仅是转换数据…