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

哈希知识基础

文章链接: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/

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。尝试用一遍扫描实现。

解法:使用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/

解法1:快慢指针法

很明显暴力的解法是两层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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7中将MySQL注册为系统服务开机启动

实际生产环境中为了避免重启服务器后所有的服务都手动启动带来的麻烦&#xff0c;建议所有基础服务都设置为开机自动启动。本章节我们主要演示在Centos7中如何将MySQL注册为系统服务&#xff0c;并实现开机自动启动。 ① 手动启动mysql&#xff0c;查看进程信息&#xff0c;复制…

手机上最危险的3个操作,千万小心!

普通人千万不要在手机上做这3个操作&#xff0c;否则你的手机早晚会被黑客入侵了。 第一种&#xff0c;苹果越狱 越狱虽然可以绕过限制给你的苹果安装上一些特殊软件&#xff0c;但只要是越狱之后的苹果手机&#xff0c;都将留下漏洞&#xff0c;黑客最喜欢寻找做过越狱的手机…

【计算机组成-算术逻辑单元】

课程链接&#xff1a;北京大学陆俊林老师的计算机组成原理课 1. 算术运算和逻辑运算 算数运算 逻辑运算 算数逻辑运算的需求 算数运算&#xff1a;两个32-bit数的加减法&#xff0c;结果为一个32-bit数&#xff1b;检查加减法的结果是否溢出逻辑运算&#xff1a;两个32-bit数…

如何优化大型语言模型,让AI回应更智能、更准确?

什么是检索增强生成&#xff08;RAG)&#xff1f; 检索增强生成&#xff08;RAG&#xff09;是一种优化大型语言模型输出的过程&#xff0c;它在生成回应之前会参考其训练数据源之外的权威知识库。大型语言模型&#xff08;LLM&#xff09;在大量数据上进行训练&#xff0c;使…

MIT 6s081 blog 1.xv6内存管理

xv6内存管理部分 xv6内存布局 内核地址空间 如xv6指导书中图3.3&#xff1a;从0x80000000开始的地址为内核地址空间&#xff0c;CLINT、PLIC、uart0、virtio disk等为I/O设备&#xff08;内存映射I/O&#xff09;&#xff0c;可以看到xv6虚拟地址到物理地址的映射&#xff0…

国产芯片应用于安防音频接口的选型分析,96KHZ 立体声ADC且高性能

在人工智能兴起之后&#xff0c;安防市场就成为了其全球最大的市场&#xff0c;也是成功落地的最主要场景之一。对于安防应用而言&#xff0c;智慧摄像头、智慧交通、智慧城市等概念的不断涌现&#xff0c;对于芯片产业催生出海量需求。今天&#xff0c;我将为大家梳理GLOBALCH…

牛客周赛 Round 2 解题报告 | 珂学家 | 字符串hash + 打家劫舍型DP + 离线双指针

前言 在黎明到来之前&#xff0c;必须有人稍微照亮黑暗。 整体评价 比赛的时候&#xff0c;A题用了字符串Hash&#xff0c;哭了。B题是经典题&#xff0c;C是模拟题&#xff0c;很怕的. D也是经典题&#xff0c;离散双指针&#xff0c;套路满满。 A. 小红的环形字符串 因为长…

识别卷子怎么弄?分享3款神奇的试卷识别软件!

在当今信息爆炸的时代&#xff0c;随着科技的飞速发展&#xff0c;人工智能已经深入到我们生活的方方面面。其中&#xff0c;试卷识别软件作为教育领域的一大亮点&#xff0c;正逐渐受到越来越多的关注。这类软件不仅能帮助教师减轻批改试卷的负担&#xff0c;还能提高工作效率…

创建YonBIP模块项目

设置UAP HOME&#xff1a; 新建项目&#xff1a;File > New > Other > YonBuilder Premium Development 创建工程和模块成功 新建业务组件currtype 新建业务组件成功

Docker容器(二)安装与初体验wordpress

一、安装 1.1关闭SeLinux SeLinux&#xff08;Security-Enhanced Linux&#xff09;是一种基于Linux内核的安全模块&#xff0c;旨在提供更严格的访问控制和安全策略。它通过强制实施安全策略来限制系统资源的访问&#xff0c;从而保护系统免受恶意软件和未经授权的访问。 在…

探索金融管理硕士项目:中国社科院与美国杜兰大学携手培养未来金融精英

在当今竞争激烈的金融行业中&#xff0c;拥有卓越的专业知识和技能是取得成功的重要因素。而中国社科院与美国杜兰大学金融管理硕士项目&#xff0c;以其严谨的学术要求和实践导向的教学方法&#xff0c;为学生提供了绝佳的学习和成长机会。 中国社科院与美国杜兰大学金融管理硕…

深度探讨 Golang 中并发发送 HTTP 请求的最佳技术

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在 Golang 领域&#xff0c;并发发送 HTTP 请求…

Java学习(十八)--网络编程

介绍 需求 如何准确地定位网络上一台或多台主机&#xff1b; 定位主机上的特定的应用 找到主机后如何可靠高效地进行数据传输 目的 直接或间接地通过网络协议与其它计算机实现数据交换&#xff0c;进行通讯&#xff1b; 网络通信 网络&#xff1a;两台或多台设备通过一…

详解SpringCloud微服务技术栈:Nacos服务搭建及服务分级存储模型

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;详解SpringCloud微服务技术栈&#xff1a;强推&#xff01;源码跟踪分析Ribbon负载均衡原理、Eureka服务部署 &#x1f4da;订阅…

MIT 6s081 lab 1.Xv6 and Unix utilities

Lab1: Xv6 and Unix utilities 作业网址&#xff1a;https://pdos.csail.mit.edu/6.828/2020/labs/util.html Boot xv6(easy) 下载&#xff0c;启动xv6系统 $ git clone git://g.csail.mit.edu/xv6-labs-2020 Cloning into xv6-labs-2020... ... $ cd xv6-labs-2020 $ git …

解决jmeter响应乱码的问题

HTTP请求响应乱码 方法一&#xff1a;添加后置处理器BeanShell PostProcessor&#xff0c;写入【prev.setDataEncoding("utf-8")】 方法二&#xff1a;修改bin目录下的配置文件jmeter.properties&#xff0c;将配置修改为【sampleresult.default.encodingUTF-8】 J…

【LeetCode每日一题】82. 删除排序链表中的重复元素 II

2024-1-15 文章目录 [82. 删除排序链表中的重复元素 II](https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/) 82. 删除排序链表中的重复元素 II 思路&#xff1a; 创建一个虚拟节点 dummy 作为头节点的前置节点。使用两个指针 pre 和 cur 分别指向前一个非…

光纤和光缆有何不同之处?

很多人会有这样的疑问&#xff0c;光纤和光缆有何不同之处&#xff1f;主要是因为光纤和光缆这两个名词容易引起混淆。在严格的定义下&#xff0c;光纤和光缆是两种不同的东西&#xff0c;然而在现实生活中&#xff0c;许多人仍然会混淆这两者。为了更好地理解光纤和光缆之间的…

全国博物馆数据, shp+excel数据,数据来源可靠,基于国家文物局发布的《2021年度全国博物馆名录》

数据名称: 全国博物馆数据 数据格式: shpexcel 数据几何类型: 点 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据&#xff0c;数据名录来源于国家文物局发布的《2021年度全国博物馆名录》 数据字段&#xff1a; 序号字段名称字段说明1province省份名称2city城市名…