北大硕士LeetCode算法专题课-查找相关问题

news2025/1/18 14:44:20

黑马算法面试专题

北大硕士LeetCode算法专题课-字符串相关问题         北大硕士LeetCode算法专题课-数组相关问题_​​​​​​
 

北大硕士LeetCode算法专题课-基础算法查找_

北大硕士LeetCode算法专题课-基础算法之排序_客

北大硕士LeetCode算法专题课---算法复杂度介绍_客

查找相关问

查找有无:

某个 元素是否存在 通过集合set 可以解决这一类问题

查找对应关系:

某个元素出现了几次, 返回满足条件元素的下标, 通过字典 Dict)可以解决这一类问题

查找问题中经常要用到集合与字典, 要熟悉相关API

 

 两个数组的交集 (LeetCode349)

给定两个数组 nums1 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序

 

时间复杂度O(mlogm+nlog

def intersection(nums1, nums2):  nums1.sort()
nums2.sort()
length1, length2 = len(nums1), len(nums2)  intersection = list()
index1 = index2 = 0
while index1 < length1 and index2 < length2:  num1 = nums1[index1]
num2 = nums2[index2]
if num1 == num2:
if not intersection or num1 != intersection[-1]:  intersection.append(num1) # 保证加入元素的唯一性
index1 += 1
index2 += 1
elif num1 < num2:  index1 += 1
else:
index2 += 1
return intersection

 思路二:利用set

def intersection( nums1, nums2):  """
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]  """
set1 = set(nums1)  set2 = set(nums2)
if len(set2)> len(set1):
return [x for x in set1 if x in set2]
else:
return [x for x in set2 if x in set1]

 时间复杂度:O(m+n)

两个数组的交集 II(LeetCode350)

给你两个整数数组 nums1 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,

应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序

def intersect(nums1, nums2):  nums1.sort()  nums2.sort()

length1, length2 = len(nums1), len(nums2)  intersection = list()
index1 = index2 = 0
while index1 < length1 and index2 < length2:
if nums1[index1] < nums2[index2]:  index1 += 1
elif nums1[index1] > nums2[index2]:  index2 += 1
else:
intersection.append(nums1[index1])  index1 += 1
index2 += 1

return intersection

两个数组的交集 II(LeetCode350)  

思路二:利用字典

def intersect2(nums1, nums2):
if len(nums1) > len(nums2):
return intersect2(nums2, nums1)

m = collections.Counter()
for num in nums1:  m[num] += 1

intersection = list()
for num in nums2:
if m.get(num, 0) > 0:  intersection.append(num)  m[num] -= 1
if m[num] == 0:  m.pop(num)

return intersection

复杂度分析

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

空间复杂度:O(min(m,n)),其中 m n 分别是两个数组的长度

同构字符串 (LeetCode205)

给定两个字符串 s t ,判断它们是否同构。如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映 射到同一个字符上,字符可以映射到自己本身。

 使用字典构建查找表

def isIsomorphic(s, t):
if len(t) != len(s):
return False  dict_s = {}  dict_t = {}
for i in range(len(s)):
s_char, t_char = s[i], t[i]
if s_char not in dict_s:  dict_s[s_char] = t_char
if t_char not in dict_t:  dict_t[t_char] = s_char
if dict_s[s_char] != t_char or dict_t[t_char] != s_char:
return False
return True

 度分析时间复杂度:O(n)

两数之和 (LeetCode 1)

给定一个整数数组nums和一个整数目标值target请你在该数组中找出和为目标值 target那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

两数之和 (LeetCode 1)

解法一 暴力解法 双重for循环O(N2

解法二:使用查找表(dict),可以将寻找 target - x 的时间复杂度降低到从 O(N) 降低到 O(1)。

创建一个字典,对于每一个 x,首先查询字典中是否存在 target - x,然后将 x 插入到字典中,即可保证不会让 x  和自己匹配。

def twoSum(nums, target):  hashtable = dict()
for i, num in enumerate(nums):
if target - num in hashtable:
return [hashtable[target - num], i]  hashtable[nums[i]] = i
return []

 复杂度分析时间复杂度:时间复杂度:O(N),其中 N是数组中的元素数量。Python dict 查找时间复杂度O(1)  空间复杂度:O(N)

四数相加 II (LeetCode454)

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

0 <= i, j, k, l < n

nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

示例 1

输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]

输出:提示 1 <= n <= 200

解释:

1.  (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0

2.  (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0

将四个数组分成两部分,A B 为一组,C D 为另外一组。

对于 A B,我们使用二重循环对它们进行遍历,得到所有 A[i]+B[j] 的值并存入哈希映射中。对于哈希映射中的每个键值对,每 个键表示一种 A[i]+B[j],对应的值为 A[i]+B[j]出现的次数。

对于 C D,我们同样使用二重循环对它们进行遍历。当遍历到 C[k]+D[l] 时,如果 -(C[k]+D[l]) 出现在哈希映射中,那么将 -  (C[k]+D[l]) 对应的值累加进答案中。

最终即可得到满足 A[i]+B[j]+C[k]+D[l]=0=的四元组数目。

复杂度分析:时间复杂度:O(n2)     空间复杂度:O(n2)

def fourSumCount(A, B, C, D):
countAB = collections.Counter(u + v for u in A for v in B)  ans = 0
for u in C:
for v in D:
if -u - v in countAB:
ans += countAB[-u - v]
return ans

存在重复元素 II (LeetCode 219)

给你一个整数数组nums和一个整数 k ,判断数组中是否存在两个不同的索引 i j ,满足nums[i] == nums[j] abs(i - j) <= k 。 如果存在,返回 true ;否则,返回 false

 解法1 创建字典用于查找,遍历的过程中,判断在字典中是否存在满足条件的key如果满足直接返回True如不满足,则将数 组中元素不断放入字典中, key为数值, value为索引

def containsNearbyDuplicate(nums, k):  pos = {}
for i, num in enumerate(nums):
if num in pos and i - pos[num] <= k:
return True  pos[num] = i
return False

解法2 滑动窗口, 创建一个set 用来保存窗口中数据, 当扩大窗口时, 如果从set中能取到新加入的值, 说明有满足条件的元素

 

 

 

解法2 滑动窗口

def containsNearbyDuplicate2(nums, k):  s = set()
for i, num in enumerate(nums):
if i > k:
s.remove(nums[i - k - 1])
if num in s:
return True  s.add(num)
return False

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

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

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

相关文章

Neo4j框架学习之一安装和使用

文章目录1、何为Neo4j2、安装和使用2.1 安装2.2 基础概念1、何为Neo4j ​ Neo4j是一个高性能的NOSQL图形数据库&#xff0c;是一个嵌入式的、基于磁盘的&#xff0c;数据结果为网格(图)、具备完全的事务特性的Java持久化引擎。 数据结构 ​ 在一个图中包含两种基本的数据类型…

从浏览器里输入URL构建你的前端知识体系

嗨&#xff01;我是团子&#xff0c;好久不见~ 记得22年寒假复习八股的时候&#xff0c;一直在苦恼怎样才能把八股的内容真正的转换为自己的知识。毕竟光靠死记硬背每个知识点&#xff0c;是不能在面试中给面试官留下不错的印象的。后面在整理《浏览器里输入URL后发生了什么》…

Stellarium 1.2 正式发布

导读Stellarium 1.2 已发布。Stellarium 是一款免费开源 GPL&#xff08;自由软件基金会 GNU 通用公共许可证&#xff09;软件&#xff0c;它使用 OpenGL 图形接口对星空进行实时渲染。 软件可以模拟肉眼、双筒望远镜和小型天文等观察天空&#xff0c;根据观测者所处时间和位置…

项目管理:项目经理如何创建项目日程计划表

当项目经理接手项目后&#xff0c;要做好项目的日程安排&#xff0c;这是决定项目是否成功完成的最重要任务之一。 项目经理都希望项目按照制定好的进度计划完工&#xff0c;但在实际的情况中&#xff0c;总会有那么一两个项目会出现进度延迟的情况&#xff0c;管理者可以使用…

忆享科技戟星安全实验室|OSS的STS模式授权案例

戟星安全实验室忆享科技旗下高端的网络安全攻防服务团队.安服内容包括渗透测试、代码审计、应急响应、漏洞研究、威胁情报、安全运维、攻防演练等。本文约957字&#xff0c;阅读约需3分钟。前言《漏洞挖掘系列》将作为一个期刊持续更新&#xff0c;我们会将项目中所遇到的觉得有…

图像编辑Photoshop 2023中文新

Photoshop2023从照片编辑和合成到数字绘画、动画和图形设计-只要能想到&#xff0c;就能在Photoshop中创作出来。相信大家都有在用之前的版本&#xff0c;这款软件功能丰富&#xff0c;实用性很强&#xff0c;有着大量的功能用户都可以用上&#xff0c;不管是美化还是滤镜&…

基于冲突搜索(CBS)的多智能体路径寻优(MAPF)

1 背景 1.1 问题描述 多智能体路径寻优( Multi-Agent Path Finding&#xff0c;MAPF )问题由一个无向无权图G ( V &#xff0c;E )和一组k个智能体组成&#xff0c;其中智能体有起始点和目标点。时间被离散化为时间步。在连续的时间步之间&#xff0c;每个智能体既可以移动到…

Kafka生产者——消息发送流程,同步、异步发送API

生产者消息发送流程 发送原理 Kafka的Producer发送消息采用的是异步发送的方式。 在消息发送的过程中&#xff0c;涉及到了两个线程:main线程和Sender线程&#xff0c;以及一个线程共享变量:RecordAccumulator。 ①main线程中创建了一个双端队列RecordAccumulator&#xff0c…

Spring Boot 创建和使用

Spring Boot 创建和使用一、什么是 Spring Boot二、Spring Boot 优点三、Spring Boot 项目创建3.1 使用 Idea 创建验证3.2 网页版创建四、项目目录介绍五、约定大于配置 (重要)5.1 启动类5.2 自定义类在目录中的位置一、什么是 Spring Boot Spring 的诞⽣是为了简化 Java 程序…

《架构300讲》学习笔记(51-100)

前言 内容来自B站IT老齐架构300讲内容。 053动静分离 静态数据&#xff1a;无个性化的数据&#xff0c;静态文件&#xff0c;低频变动的数据。 动态数据&#xff1a;个性化推荐&#xff0c;高频写。 有效的区分页面中的动静数据是优化的关键前提。 页面伪静态化技术&#x…

【Leetcode】308. 二维区域和检索 - 可变

一、题目 1、题目描述 给你一个 2D 矩阵 matrix&#xff0c;请计算出从左上角 (row1, col1) 到右下角 (row2, col2) 组成的矩形中所有元素的和。 实现 NumMatrix 类&#xff1a; NumMatrix(int[][] matrix) 用整数矩阵 matrix 初始化对象。void update(int row, int col, i…

OpenCv相机标定——圆形标定板标定

提取角点时与黑白棋盘格差别主要在于寻找角点的函数&#xff0c;只需将第一章内第二段代码 ret, corners1 cv.findChessboardCorners(img_gray, (w, h)) # 寻找内角点改为 ret, corners1 cv.findCirclesGrid(img_gray, (w, h)) # 寻找内角点&#xff0c;更详细的内容参考第一…

盘点| 能够实现小程序开发提效的框架/工具有这些

近年来&#xff0c;为了研发效率的提升&#xff0c;技术高频革新&#xff0c;开发者们纷纷表示&#xff1a;“好是好&#xff0c;就是快学不动了&#xff01;”。开发者们在不断学习新语言、框架、工具等内容的同时&#xff0c;也在担心所学是否真正有用。而小程序其实能够帮助…

9、Javaweb_http响应概念Response+验证码案例ServletContext+文件下载

HTTP协议&#xff1a; 1. 请求消息&#xff1a;客户端发送给服务器端的数据 * 数据格式&#xff1a; 1. 请求行 2. 请求头 3. 请求空行 4. 请求体 2. 响应消息&#xff1a;服务器端发送给客户端的数据 * 数据格式&#xff1a; …

Nginx 常用配置、操作详解

学习每个技术都要有目标&#xff0c;比如说要源码精通gRPC实现原理&#xff0c;要熟练应用Prometheus、Gin&#xff0c;以及Nginx&#xff0c;Nginx个人定位目标是不需要深入了解技术原理、更不要阅读源码&#xff0c;只需要在自己使用的时候能通过本文章快速检索就够了。 在看…

Graphing calculator PRO

Graphing calculator PRO计算器是一个专业的计算器&#xff0c;它也是编译的&#xff0c;也是学生和学生需要的工具。该程序旨在取代大型和昂贵的图形计算。此外&#xff0c;它在手机或广告牌显示屏上以更高的质量显示计算&#xff0c;这使其更易于理解。Mathlab提供的计算器是…

【云原生进阶之容器】第三章List-Watch机制3.1节-- List-Watch机制剖析

1 list-watch机制 1.1 list-watch介绍 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作,保持数据同步的,每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件,向 APIServer 发送命令,在 Node 节点上面建立 Pod 和 Container。 APIServer 经过 API 调…

回收租赁商城系统功能拆解06讲-商品评价

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格&#xff0c;后台调整最终回收价&#xff0c;用户同意回收后系统即刻放款&#xff0c;用户微信零…

Ubuntu20.04 (ROS noetic) 运行 Vins-Fusion

参考博客&#xff1a;Ubuntu20.04 运行 Vins-Fusion&#xff0c;问题没有完全解决&#xff0c;所以自己写了一篇Vins-Fusion 开源地址&#xff1a;https://github.com/HKUST-Aerial-Robotics/VINS-Fusion由于仅支持ROS kinetic 和 melodic&#xff0c;所以在Ubuntu20.04对应的R…

【Nginx】Nginx的安装

1. 基于apt源安装 1.1 安装1.2 测试安装是否成功1.3 卸载 1. 停止nginx服务2. 删除nginx&#xff0c;-purge包括配置文件3. 移除全部不使用的软件包4. 罗列出与nginx相关的软件并删除5. 查看nginx正在运行的进程&#xff0c;如果有就kill掉 2. 通过源码包编译安装 1. 安装各种…