二刷力扣--哈希表

哈希表

哈希表可以根据键在O(1)时间内进行访问。
哈希表实际上可以看成是一个数组,但是可以通过哈希函数计算出数组下标,直接访问。

常用的有集合set(),字典dict()

有效的字母异位词 242.

#字典
给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 st 中每个字符出现的次数都相同,则称 st 互为字母异位词。

  1. 使用数组
class Solution:def isAnagram(self, s: str, t: str) -> bool:record = [0] * 26for i in s:#并不需要记住字符a的ASCII,只要求出一个相对数值就可以了record[ord(i) - ord("a")] += 1for i in t:record[ord(i) - ord("a")] -= 1return  all(x == False for x in record)
  1. 使用字典
class Solution:def isAnagram(self, s: str, t: str) -> bool:from collections import defaultdicts_dict = defaultdict(int)t_dict = defaultdict(int)for x in s:s_dict[x] += 1for x in t:t_dict[x] += 1return s_dict == t_dict

Python还提供了一个默认的计数器Counter,效果和上面一样。

class Solution(object):def isAnagram(self, s: str, t: str) -> bool:from collections import Counterreturn Counter(s) == Counter(t)

两个数组的交集 349.

#集合
给定两个数组 nums1nums2 ,返回 它们的交集
Python 的set实现了集合运算,直接转换成集合然后求交。

class Solution:def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:set_1 = set(nums1)set_2 = set(nums2)return  list(set_1 & set_2)

快乐数 202.

#集合
编写一个算法来判断一个数 n 是不是快乐数。

使用集合来判断n有没有出现过。

class Solution:def isHappy(self, n: int) -> bool:def get_sum(num):s = 0while num:     s +=  (num % 10)** 2num =  num // 10return svisited = set()while n != 1 and  not n in visited:visited.add(n)n = get_sum(n)return  n == 1

除了正常的取余获得num各位数字,还可以用字符串:

n = sum(int(i) ** 2 for i in str(n))

两数之和 1.

#字典
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
容易想到用暴力循环来两两匹配,时间复杂度为O(N^2)。但是学完字典后,可以想到用字典存储出现过的数字及下标。 遍历过程中可以查看字典中是否有能组成target的数。时间复杂度为O(N)。
(也可以用集合存储数字,但是还需要找一次下标)

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:d = dict()for i,n in enumerate(nums):if target-n in d:return i, d[target-n]else:d[n] = i

四数相加II 454.

#字典
给你四个整数数组 nums1nums2nums3nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

  • 0 <= i, j, k, l < n
  • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

两数相加的扩展版。
从四个数组中各取一个数,和为0。
容易想到将四数相加变成两数相加。这样就将4重循环变成2重循环。
nums1 + nums2 = -(nums3 + nums4)

class Solution:def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:d = defaultdict(int)for i in nums1:for j in nums2:d[i+j]  += 1count  = 0 for k in nums3:for l in nums4:count += d[-(k+l)]return count

赎金信 383.

#字典
给你两个字符串:ransomNotemagazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

和 有效的字母异位词有点像,但是这里只要magazine中字符数量大于ransomNote

class Solution:def canConstruct(self, ransomNote: str, magazine: str) -> bool:d_ransomNote = Counter(ransomNote)d_magazine = Counter(magazine)for k,v in d_ransomNote.items():if k not in d_magazine or d_magazine[k] < v:return Falsereturn True

三数之和 15.

#字典 #双指针
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。
可以用字典做,两重循环确定num[i]nums[j],然后用字典确定是否有nums[k] == -(nums[i]+ nums[j])

class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:d = defaultdict(list)for i,n in enumerate(nums):d[n].append(i)res = set()for i in range(len(nums)):for j in range(i+1, len(nums)):if  -(nums[i] + nums[j]) in d and d[-(nums[i] + nums[j])] != [i] \and d[-(nums[i] + nums[j])] != [j]  and d[-(nums[i] + nums[j])] != [i,j]:res.add(tuple(sorted([nums[i], nums[j],-(nums[i] + nums[j]) ])))return [list(t) for t in res]

双指针:
需要先对nums排序。
固定i后,用指针left和right找剩余的两个数。
(这里我去重直接用了set,没有像网站那样额外判断。)

class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:nums.sort()res = set()for i in range(len(nums)):if nums[i] > 0:breakif i > 0 and nums[i] == nums[i-1]:continueleft = i+1right = len(nums) - 1while right > left:s = nums[i] + nums[left] + nums[right]if s < 0:left += 1elif s > 0:right -= 1else:res.add((nums[i], nums[left], nums[right]))right -= 1left += 1return  [list(t)  for t in res]

四数之和 18.

#双指针
在三数之和的基础上再套一层for循环。

class Solution:def fourSum(self, nums: List[int], target: int) -> List[List[int]]:   nums.sort()res  = set()for i in range(len(nums)):for j in range(i+1, len(nums)):left = j+1right = len(nums) - 1while left < right:s = nums[i]+nums[j] + nums[left] + nums[right]if s < target:left += 1elif s > target:right -= 1else:res.add((nums[i],nums[j] , nums[left] , nums[right]))left += 1right -= 1return  [list(t)  for t in res]

哈希表小结

哈西表常用来判断元素是否出现过,统计出现次数去重
本章题目大多数和数组相关,用到了对数组排序双指针的方法。

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

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

相关文章

Linux查询服务器配置(CPU、内存RAM等)命令

lshw -short 更多命令参考地址&#xff1a;查看linux服务器配置详解_笔记大全_设计学院

《C++标准库第2版》3.1 C++11语言新特性 笔记

3.1 C11 语言新特性 3.1.1 微小但是重要的语法提升 ​ 1.template 表达式内的空格 ​ 在两个template表达式的闭符之间放一个空格已经过时&#xff0c;目前两个版本的C11以后两个版本都支持 vector<list<int> >; // 这是以前的版本 vector<list<int>&…

PbootCMS在搭建网站

1、打开网站 https://www.pbootcms.com/ 2、点击 “本站” 下载最新的网站代码 3、在本地laragon/www下创建目录&#xff08;hejuwuye&#xff09;&#xff0c;并将代码放进去 4、创建本地数据库&#xff0c;数据库名称为&#xff1a; hejuwuye&#xff0c;然后将static/bac…

快速傅里叶变换

引言 目标 傅里叶变化&#xff08;Fourier transform&#xff09;是一种信号处理技术&#xff0c;它可以将时间信号转换为频率信号&#xff0c;即将一组具有相同数量频率的正弦波叠加在一起&#xff0c;形成一组新的正弦波。如果我们把时间信号从频域转换到时域&#xff0c;那么…

SLAM ORB-SLAM2(1)总体框架

SLAM ORB-SLAM2(1)总体框架 1. 简介2. 框架3. TRACKING4. LOCAL MAPPING5. LOOP CLOSING6. MAP1. 简介 ORB-SLAM2 是一个实时和完整的视觉SLAM系统(包括闭环检测、重定位、地图重用等功能) 提供了利用单目、双目以及RGB-D相机完成稀疏三维重建的功能和接口 2. 框架 总体来说…

python项目制作docker镜像,加装引用模块,部署运行!

一、创建Dockerfile # 基于python:3.10.4版本创建容器 FROM python:3.10.4 # 在容器中创建工作目录 RUN mkdir /app # 将当前Dockerfile目录下的所有文件夹和文件拷贝到容器/app目录下 COPY . /app# 由于python程序用到了requests模块和yaml模块&#xff0c; # python:3.10.4基…

二叉树进阶练习

目录 一、根据二叉树创建字符串 二、二叉树的最近公共祖先 三、二叉搜索树与双向链表 四、从前序与中序遍历序列构造二叉树 五、从中序与后序遍历序列构造二叉树 六、二叉树的前序遍历&#xff08;非递归实现&#xff09; 七、二叉树的中序遍历&#xff08;非递归实现&a…

紫光展锐5G芯T820 解锁全新应用场景,让机器人更智能

数字经济的持续发展正推动机器人产业成为风口赛道。工信部数据显示&#xff0c;2023年上半年&#xff0c;我国工业机器人产量达22.2万套&#xff0c;同比增长5.4%&#xff1b;服务机器人产量为353万套&#xff0c;同比增长9.6%。 作为国内商用服务机器人领先企业&#xff0c;云…

应用在儿童平板防蓝光中的LED防蓝光灯珠

现在电子产品多&#xff0c;手机、平板电脑、电子书等等&#xff0c;由于蓝光有害眼睛健康&#xff0c;于是市场上有很多防蓝光的眼镜、防蓝光的手机膜、防蓝光的平板&#xff0c;这些材料和设备到底有没有用&#xff1f;如何正确预防蓝光危害呢&#xff1f; 我们现在所用的灯…

NCTF-2019-Crypto部分 复现

文章目录 SorechildRSAeasyRSAbabyRSA Sore 题目描述&#xff1a; task.py from string import ascii_letters from flag import flagctoi lambda x: ascii_letters.index(x) # 获得所有字母的字符串 itoc lambda x: ascii_letters[x] # 将索引值转换为字母key flag.strip…

关于 Resolution(分辨率、解析力)各单位的意义及相互之间的换算

1、问题背景 最近在调试的项目&#xff0c;有关于对解析力的要求&#xff0c;用 imatest 软件测试 MTF50 的值&#xff0c;如下图所示&#xff0c;可以看到他有不同的单位表示&#xff0c;LW/PH、Cycles/pixel 。另外关于解析力的单位还有LP/mm、L/mm、Cycles/mm、LP/PH&#…

MySQL安装validate_password_policy插件

功能介绍 validate_password_policy 是插件用于验证密码强度的策略。该参数可以设定三种级别&#xff1a;0代表低&#xff0c;1代表中&#xff0c;2代表高。 validate_password_policy 主要影响密码的强度检查级别&#xff1a; 0/LOW&#xff1a;只检查密码长度。 1/MEDIUM&am…

jsoup框架技术文档--java爬虫--基本概念

阿丹&#xff1a; 之前使用python写的爬虫&#xff0c;但是现在项目的技术选型是需要使用jsoup来爬取网页的数据。那就需要重新学习一个框架。首先了解一下整体框架的基本概念。 jsoup的概念 JSoup是一个开源的Java库&#xff0c;它用于处理HTML文档&#xff0c;类似于一个用于…

QT tcpserver

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 服务端有QTcpServer库&#xff0c;封装了监听操作server new QTcpServer();// 直接监听&#xff0c;内部根…

Object的常用方法

目录 1.getClass()&#xff1a;获得运行时类型 2.hashCode()&#xff1a;获取哈希值 3.equals()&#xff1a;比较方法 4.clone()&#xff1a;实现对象的浅拷贝方法 5.toString()&#xff1a;输出为String 6.notify()&#xff1a;唤醒线程 7.notifyAll()&#xff1a;…

MVSNet CVPR-2018 学习总结笔记 译文 深度学习三维重建

文章目录 2 MVSNet CVPR-20182.0 主要特点2.1 过程2.2 MVSNet主要贡献2.3 论文简介2.3.1 深度特征提取2.3.2 构造匹配代价2.3.3 代价累计2.3.4 深度估计2.3.5 深度图优化2.4 MVSNet(pytorch版本)2 MVSNet CVPR-2018 MVSNet (pytorch版) 代码注释版 下载 (注释非常详细,代码…

IO流(IO Stream)

​ 一、概述 我们已经系统学习了File 类&#xff0c;并且已经知道 File 类的实例用于表示文件或目录的路径 名。 虽然我们可以通过 File 实例来访问文件或目录的元数据&#xff0c;甚至可以创建、删除文件或目 录&#xff0c;但是&#xff0c;我们却不能通过File实例来访问文…

春秋云镜 CVE-2015-1427

春秋云镜 CVE-2015-1427 ElasticSearch RCE 靶标介绍 ElasticSearch RCE 启动场景 漏洞利用 因查询时至少要求es中有一条数据&#xff0c;所以发送如下数据包&#xff0c;增加一个数据&#xff1a; POST /website/blog/ HTTP/1.1 Host: eci-2zedttamjkr80i9iubel.cloudeci…

Java基础11——抽象类和接口

Java基础11——抽象类和接口 抽象类和抽象方法 区分普通方法和抽象方法 在Java 中&#xff0c;当一个类被 abstract 关键字修饰的时候这个类称为抽象类。当一个类的方法被 abstract 关键字修饰的时候&#xff0c;该方法称为抽象 方法。抽象方法必须定义在抽象类中。当一个方…

leetcode 1921. 消灭怪物的最大数量(每日一题)

最近学习的状态找回很多。慢慢来吧&#xff0c;加油&#xff01; 1921. 消灭怪物的最大数量 你正在玩一款电子游戏&#xff0c;在游戏中你需要保护城市免受怪物侵袭。给你一个 下标从 0 开始 且长度为 n 的整数数组 dist &#xff0c;其中 dist[i] 是第 i 个怪物与城市的 初始…