早上好,我的leetcode 【hash】(第二期)

写在前面:坚持才是最难的事情

C++代码还是不方便写,改用python了,TAT


文章目录

  • 1.两数之和
  • 49. 字母异位词分组
  • 128.最长连续序列

1.两数之和

你好,梦开始的地方~

在这里插入图片描述
https://leetcode.cn/problems/two-sum/description/?envType=study-plan-v2&envId=top-100-liked

直接两个for循环

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

        int size = nums.size();
        for (int i = 0; i < size; i++ ){
            for (int j = i + 1; j < size; j++){
                if (nums[i] + nums[j] == target){
                    return {i ,j};
                }
            }
        }
        return {};
    }
};

时间复杂度:O( N 2 N^2 N2),其中N是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次
空间复杂度:O (1)。

最容易想到的方法是枚举数组中的每一个数 x,寻找数组中是否存在 target - x。方法一的时间复杂度较高的原因是寻找 target - x 的时间复杂度过高。因此,我们需要一种更优秀的方法,能够快速寻找数组中是否存在目标元素。如果存在,我们需要找出它的索引。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> hashtable;
        for (int i = 0; i < nums.size(); ++i){
            auto it = hashtable.find(target - nums[i]);
            // 如果找到了就返回
            if (it != hashtable.end()){
                return {it->second, i};
            }
            // 都保存这个数的位置
            hashtable[nums[i]] = i;
        }
        return {};

    }
};

49. 字母异位词分组

在这里插入图片描述
https://leetcode.cn/problems/group-anagrams/description/?envType=study-plan-v2&envId=top-100-liked

思路:将字符串排序,字符串排序后相同的放在一起

由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。

class Solution {
private:
    unordered_map<string, vector<string>> hash;
    vector<vector<string>> ans;
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        for (const auto& str : strs){
            string tmp = str;
            sort(tmp.begin(), tmp.end());
            hash[tmp].emplace_back(str);
        }
        for (const auto& one: hash){
            ans.emplace_back(one.second);
        }
        return ans;
    }
};

时间复杂度 : O ( n k log ⁡ k ) :O(nk\log k) :O(nklogk),其中 n n n s t r s strs strs 中的字符串的数量, k k k s t r s strs strs 中的字符串的的最大长度。需要遍历 n n n 个字符串,对于每个字符串,需要 O ( k log ⁡ k ) O(k\log k) O(klogk) 的时间进行排序以及 O ( 1 ) O(1) O(1) 的时间更新哈希表,因此总时间复杂度是 O ( n k log ⁡ k ) O(nk\log k) O(nklogk)

空间复杂度: O ( n k ) O(nk) O(nk),其中 n n n s t r s strs strs 中的字符串的数量, k k k s t r s strs strs 中的字符串的的最大长
度。需要用哈希表存储全部字符串。


方法二:计数
由于互为字母异位词的两个字符串包含的字母相同,因此两个字符串中的相同字母出现的次数一定是相同的,故可以将每个字母出现的次数使用字符串表示,作为哈希表的键。

由于字符串只包含小写字母,因此对于每个字符串,可以使用长度为 26 的数组记录每个字母出现的次数。、

还是python写比较方便,C++太不熟悉了TAT

class Solution(object):
    def groupAnagrams(self, strs):
        """
        :type strs: List[str]
        :rtype: List[List[str]]
        """
        mp = collections.defaultdict(list);

        for st in strs:
        	# 记录字母出现的次数
            counts = [0] * 26
            for ch in st:
            	# 字母出现记录+1
            	# ord() 函数返回一个字符的Unicode码点,因此 ord(ch) 返回字符 ch 的Unicode码点
                counts[ord(ch) - ord("a")] += 1
            
            # 两个字符串中的相同字母出现的次数一定是相同的,放在一起
            mp[tuple(counts)].append(st)
        
        return list(mp.values())

时间复杂度 : O ( n ( k + ∣ Σ ∣ ) ) :O(n(k+|\Sigma|)) :O(n(k+∣Σ∣)),其中 n n n s t r s strs strs 中的字符串的数量, k k k s t r s strs strs 中的字符串的的最大长度,Σ 是字符集,在本题中字符集为所有小写字母, ∣ Σ ∣ = 26 |\Sigma|=26 ∣Σ∣=26。需要遍历 n n n 个字符串,对于每个字符串,需要 O ( k ) O(k) O(k) 的时间计算每个字母出现的次数, O ( ∣ Σ ∣ ) O(|\Sigma|) O(∣Σ∣) 的时间生成哈希表的键, 以及 O ( 1 ) O(1) O(1) 的时间更新哈希表,
因此总时间复杂度是 O ( n ( k + ∣ Σ ∣ ) ) O(n(k+|\Sigma|)) O(n(k+∣Σ∣))

空间复杂度: O ( n ( k + ∣ Σ ∣ ) ) O(n(k+|\Sigma|)) O(n(k+∣Σ∣)),其中 n n n s t r s strs strs 中的字符串的数量, k k k s t r s strs strs 中的字符串的最大
长度,Σ 是字符集,在本题中字符集为所有小写字母, ∣ Σ ∣ = 26 |\Sigma|=26 ∣Σ∣=26。需要用哈希表存储全部字符串,而记录每个字符串中每个字母出现次数的数组需要的空间为 O ( ∣ Σ ∣ ) O(|\Sigma|) O(∣Σ∣), 在渐进意义下小于 O ( n ( k + ∣ Σ ∣ ) ) O(n(k+|\Sigma|)) O(n(k+∣Σ∣)),忽略不计。

128.最长连续序列

在这里插入图片描述
https://leetcode.cn/problems/longest-consecutive-sequence/description/?envType=study-plan-v2&envId=top-100-liked

我们考虑枚举数组中的每个数 x x x,考虑以其为起点,不断尝试匹配 x + 1 , x + 2 , ⋯ x+1,x+2,\cdots x+1,x+2,是否存在,假设最长匹配到了 x + y x+y x+y,那么以 x x x 为起点的最长连续序列即为 x , x + 1 , x + 2 , ⋯   , x + y x,x+1,x+2,\cdots,x+y x,x+1,x+2,,x+y, 其长度为
y + 1 y+1 y+1, 我们不断枚举并更新答案即可。

对于匹配的过程,暴力的方法是 O ( n ) O(n) O(n) 遍历数组去看是否存在这个数,但其实更高效的方法是用一
个哈希表存储数组中的数,这样查看一个数是否存在即能优化至 O ( 1 ) O(1) O(1) 的时间复杂度。

仅仅是这样我们的算法时间复杂度最坏情况下还是会达到 O ( n 2 ) O(n^2) O(n2)
即外层需要枚举 O ( n ) O(n) O(n) 个数,内层需要暴力匹配 O ( n ) O(n) O(n) 次), 无法满足题目的要求。

但仔细分析这个过程,我们会发现其中执行了很多不必要的枚举,如果已知有一个 x , x + 1 , x + 2 , ⋯   , x + y x,x+1,x+2,\cdots,x+y x,x+1,x+2,,x+y 的连续序列,而我们却重新从 x + 1 x+1 x+1 , x + 2 x+2 x+2 或者是 x + y x+y x+y 处开始尝试匹配,那么得到的结果肯定不会优于枚举 x x x 为起点的答案,因此我们在外层循环的时候碰到这种情况跳过即可。

那么怎么判断是否跳过呢? 由于我们要枚举的数 x x x一定是在数组中不存在前驱数 x − 1 x- 1 x1的,不然按
照上面的分析我们会从 x − 1 x-1 x1 开始尝试匹配,因此我们每次在哈希表中检查是否存在 x − 1 x-1 x1 即能判断是否需要跳过了。

class Solution(object):
    def longestConsecutive(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        longest_streak = 0
        num_set = set(nums)

        for num in num_set:
            if num - 1 not in num_set:
                current_num = num
                current_streak = 1

                while current_num + 1 in num_set:
                    current_num += 1
                    current_streak += 1

                longest_streak = max(longest_streak, current_streak)

        return longest_streak    

时间复杂度: O ( n ) O(n) O(n),其中 n n n 为数组的长度。具体分析已在上面正文中给出。
空间复杂度: O ( n ) O(n) O(n)。哈希表存储数组中所有的数需要 O ( n ) O(n) O(n) 的空间。

在 Python 中,使用 in 操作符来判断元素是否存在于 set 中,其平均时间复杂度是 O(1)。这是因为 set 是基于哈希表实现的,在大多数情况下,通过哈希函数将元素映射到哈希表的特定位置,可以在常数时间内进行查找操作。当然,如果出现哈希冲突,时间复杂度可以增高到 O(n)。但是在平均情况下,查询元素是否在 set 中仍然是效率很高的操作。

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

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

相关文章

PMP项目管理 - 采购管理

系列文章目录 PMP项目管理 - 质量管理 PMP项目管理 - 采购管理 PMP项目管理 - 资源管理 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. PMP项目管理 -…

Next.js加载异步组件 骨架屏

Next.js 中有两种处理页面加载的方式&#xff0c;一种是 Loading UI 一种是 Streaming。接下来我将介绍这两种的区别&#xff0c;以及实际的业务场景。 当我们进入某个页面时&#xff0c;需要获取页面数据&#xff0c;可能是从数据库读取也有可能是 API 服务&#xff0c;总之这…

Linux---进程概念

目录 一、冯诺依曼体系结构 二、操作系统 1.关于下三层的理解 2.关于上三层的理解 三、进程 1.进程(也叫做任务)对应的标识符---pid 2.fork---用代码创建进程(系统接口) 1&#xff09;初步认识一下fork 2&#xff09;fork函数的返回值 3&#xff09;fork的原理 问题1…

残差网络中的BN (Batch Normalization 批标准化层)的作用是什么?

文章目录 什么是BN &#xff08;Batch Normalization 批标准化层&#xff09;一、BN层对输入信号进行以下操作:二、BN 层有什么作用&#xff1f; 什么是BN &#xff08;Batch Normalization 批标准化层&#xff09; BN层的全称是Batch Normalization层,中文可以翻译为批标准化…

[Big Bird]论文解读:Big Bird: Transformers for Longer Sequences

文章目录 1 介绍2 模型架构3 结果 论文&#xff1a;Big Bird: Transformers for Longer Sequences 作者&#xff1a;Manzil Zaheer, Guru Guruganesh, Avinava Dubey, Joshua Ainslie, Chris Alberti, Santiago Ontanon, Philip Pham, Anirudh Ravula, Qifan Wang, Li Yang, Am…

多维时序 | MATLAB实现RIME-LSSVM【23年新算法】基于霜冰优化算法(RIME)优化最小二乘向量机(LSSVM)多变量时间序列预测

多维时序 | MATLAB实现RIME-LSSVM【23年新算法】基于霜冰优化算法(RIME)优化最小二乘向量机(LSSVM)多变量时间序列预测 目录 多维时序 | MATLAB实现RIME-LSSVM【23年新算法】基于霜冰优化算法(RIME)优化最小二乘向量机(LSSVM)多变量时间序列预测预测效果基本介绍模型描述程序设…

【最新版】在WSL上运行 Linux GUI (图形用户界面)应用(Gnome 文本编辑器、GIMP、Nautilus、VLC、X11 应用)

文章目录 一、 安装WSL1. 全新安装2. 现有 WSL 安装 二、运行 Linux GUI 应用1. 更新发行版中的包2. 安装 Gnome 文本编辑器启动 3. 安装 GIMP启动 4. 安装 Nautilus启动 5. 安装 VLC启动 6. 安装 X11 应用 适用于 Linux 的 Windows 子系统 (WSL) 现在支持在 Windows 上运行 Li…

深入比较Input、Change和Blur事件:Vue与React中的行为差异解析

目录 前言 1. Input事件&#xff1a; 行为差异&#xff1a; 2. Change事件&#xff1a; 行为差异&#xff1a; 3. Blur事件&#xff1a; 行为差异&#xff1a; 4. 在Vue中的表现&#xff1a; Input事件&#xff1a; Change事件&#xff1a; Blur事件&#xff1a; 5.…

Quartus 18.1软件及支持包安装教程

安装前最好关闭电脑的杀毒软件和防火墙 安装包可以到Quartus官网下载需要的版本&#xff0c;注意选择操作系统 Quartus官网&#xff1a;FPGA 设计软件 - 英特尔 Quartus Prime (intel.cn) 下载解压后以管理员的身份运行 QuartusSetup-18.1.0.625.exe文件&#xff0c;版本不同…

Vue中的数据变化监控与响应——深入理解Watchers

目录 ​编辑 前言 1. 基本用法&#xff1a; 2. 深度监听&#xff1a; 3. 立即执行&#xff1a; 4. 监听多个数据&#xff1a; 5. 清理监听器&#xff1a; 6. 监听路由变化&#xff1a; 总结&#xff1a; 我的其他博客 前言 在Vue.js中&#xff0c;watch是一种用于监听…

【Spring】Spring中的事务

文章目录 1. Spring事务简介2. Spring事务的案例案例代码代码目录结构数据库pom.xmlResource/jdbc.propertiesconfig/SpringConfig.javaconfig/JdbcConfig.javaconfig/MyBatisConfig.javadao/AccountDao.javaservice/AccountService.javaservice/impl/AccountServiceImpl.java测…

设计模式 简单工厂 工厂方法模式 抽象工厂模式

工厂模式介绍 工厂模式是我们最常用的实例化对象模式了&#xff0c;是用工厂方法代替new操作的一种模式。它是创建型模式。 简单工厂 简单工厂模式是指由一个工厂对象决定创建出哪一种产品类的实例, 但它不属于GOF 23种设计模式 简单工厂适用于工厂类负责创建的对象较少的场景,…

Command line is too long. Shorten command line for Application or also

一、问题描述 Error running ‘Application’: Command line is too long. Shorten command line for Application or also for Spring Boot default configuration? 二、原因分析 springboot项目启动命令过长&#xff01; 三、解决方案 第1步:点击项目启动配置项 第2步…

基于ssm的简单学校课程管理系统的设计与实现(源码+调试)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于ssm的简单学校课程管…

vue2项目vue-qrcode-reader 扫一扫二维码插件

vue2项目 vue-qrcode-reader 扫一扫二维码插件 问题所在解决办法成功展示 问题所在 今天在引导师弟做扫二维码功能&#xff0c;发现通过npm install --save vue-qrcode-reade安装死活就是报错TypeError: Object...) is not a function 解决办法 百度了很多大牛的博客&#…

国内访问GitHub很卡,steam连接断开怎么办

目录 第一章、问题分析1.1&#xff09;问题1.2&#xff09;解决&#xff1a;下载个加速器就好了 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、问题分析 1.1&#xff09;问题 国内访问GitHub很卡怎…

数据分析(一)(附带实例和源码)

一、主要目的&#xff1a; 主要利用Python包&#xff0c;如Numpy、Pandas和Scipy等常用分析工具并结合常用的统计量来进行数据的描述&#xff0c;把数据的特征和内在结构展现出来。熟悉在Python开发环境中支持数据分析的可用模块以及其中的方法&#xff0c;基于一定的样例数据…

Windows中安装Git软件和TortoiseGit软件

1、git软件下载地址 https://git-scm.com/download/win 2、TortoiseGit软件下载 >https://tortoisegit.org/download/ 3、软件安装 4、环境安装说明 上面介绍的是在Windows中使用git&#xff0c;如果你电脑已经装了Ubuntu系统&#xff0c;可以直接在Ubuntu中使用git命令提…

arthas获取spring bean

参考文章 arthas获取spring bean 写一个工具Util package com.example.lredisson.util;import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import o…

[RK-Linux] 移植Linux-5.10到RK3399(七)| 检查GPIO与LED节点,使能风扇接口

文章目录 一、原理图二、设备树配置三、节点控制一、原理图 ROC-RK3399-PC Pro 的 LED 接口如图: 工作灯 WORK_LED (蓝色灯)网络连接到 GPIO2_D3: DIY_LED (红色灯)网络连接到 GPIO0_B5: ROC-RK3399-PC Pro 要控制的 GPIO 接口主要是风扇,如图: FAN_CTL 网络连接到