Leetcod面试经典150题刷题记录 —— 区间篇

2023-12-28 22:28

本文主要是介绍Leetcod面试经典150题刷题记录 —— 区间篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Leetcod面试经典150题刷题记录 —— 区间篇

    • 1. 汇总区间
    • 2. 合并区间
    • 3. 插入区间
    • 4. 用最少数量的箭引爆气球

1. 汇总区间

题目链接:汇总区间 - leetcode
题目描述:
给定一个 无重复元素 的 有序 整数数组 nums 。返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。列表中的每个区间范围 [a,b] 应该按如下格式输出:
"a->b" ,如果 a != b
"a" ,如果 a == b

示例 1:
输入:nums = [0,1,2,4,5,7]
输出:[“0->2”,“4->5”,“7”]
解释:区间范围是:
[0,2] --> “0->2”
[4,5] --> “4->5”
[7,7] --> “7”
示例 2:
输入:nums = [0,2,3,4,6,8,9]
输出:[“0”,“2->4”,“6”,“8->9”]
解释:区间范围是:
[0,0] --> “0”
[2,4] --> “2->4”
[6,6] --> “6”
[8,9] --> “8->9”

题目归纳:

解题思路:
(1) 解法: 汇总区间 - leetcode官方题解

class Solution:def summaryRanges(self, nums: List[int]) -> List[str]:# 给定一个整数数组,满足以下性质# (1)无重复元素# (2)有序# 请返回 恰好覆盖数组中所有数字 的 最小有序区间范围列表,也就是说,nums的每个元素都恰好被某个区间范围所覆盖,且不存在属于某个范围,但不属于nums的数字x# demo1# 输入:nums = [0,1,2,4,5,7]# 输出:["0->2","4->5","7"]# demo2# 输入:nums = [0,2,3,4,6,8,9]# 输出:["0","2->4","6","8->9"]# 理解题意并不困难,这个章节是使用区间来求解题目,那么这道题要如何使用区间呢?# 从下标0出发,向右遍历,每次遇到相邻元素差值>1, 即找到了一个区间,遍历完数组后,则能得到一系列区间列表。# low记录区间起点,high记录区间终点# low < high,字符串表示为"low->high"# low = high, 字符串表示为"low"或"high"ans = []i = 0n = len(nums)while i < n:low = ii += 1while i < n and nums[i] == nums[i-1]+1: # 连续的有序区间i += 1high = i-1region = str(nums[low])if low < high:region = region + "->"region = region + str(nums[high])ans.append(region)return ans

2. 合并区间

题目链接:合并区间 - leetcode
题目描述:
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

题目归纳:
题意理解起来较容易。

解题思路:
解法: 合并区间 - leetcode官方题解

class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:# 排序法# 按区间左端点进行排序,那么在排完序的列表中,可合并的区间一定连续# 用数组merged存储最终答案# (1)将列表中的区间,按左端点升序排序,然后将第一个区间加入merged数组中,并按顺序依次考虑之后的每个区间# (2)若当前区间的左端点,在数组merged中最后一个区间的右断点之后,那么这两个区间不会重合,可直接将该区间加入数组merged的末尾#    否则,它们重合,用当前区间的右端点,更行数组merged中最后一个区间的右端点,取二者最大值即max(current_interval_r, last_interval_r)intervals.sort(key=lambda x: x[0]) # 以x[0]为排序的关键字merged = []for interval in intervals:# (1)如果merged为空,或,当前区间与merged最后一个区间不重合,可直接添加if not merged or merged[-1][1] < interval[0]: # merged[-1][1]最后一个区间的右端点 < 当前区间的左端点merged.append(interval)else: # (2)可以合并,并更新最后一个区间的右端点merged[-1][1] = max(merged[-1][1], interval[1])return merged

3. 插入区间

题目链接:插入区间 - leetcode
题目描述:
给你一个 无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
题目归纳:

解题思路:
解法: 插入区间 - leetcode官方题解

class Solution:def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:# 和上一题合并区间一脉相承# 题目描述:给一个无重叠的,按区间左端点排序的区间列表,往列表插入一个新区间,需要保证列表中的区间仍然有序且不重叠# 算法过程# (1)找出所有与区间newInterval重叠的区间,记为X# (2)将X中所有区间连带newInterval合并成一个大区间BIG_X# (3)最终答案即为:合并后的BIG_X + 不与X重叠的区间# 重叠的分类讨论# 考虑两个区间:S1=[l1, r1], S2=[l2, r2]# 若:# r1 < l2 or r2 < l1: 无重叠# 不符合(r1 < l2 or r2 < l1): 有重叠left, right = newInterval[0], newInterval[1]placed = False       # 是否将合并后的区间放入答案ans = []for li,ri in intervals:if ri < left:    # 当前区间在newInterval的左侧ans.append([li, ri])elif right < li: # 当前区间在newInterval的右侧if not placed:ans.append([left, right])placed = Trueans.append([li, ri])else:            # 存在交集,计算区间并集,不会往ans中添加内容left = min(left, li)right = max(right, ri)if not placed:       # 数组为空或合并到区间数组的末尾仍未放置ans.append([left, right])return ans

4. 用最少数量的箭引爆气球

题目链接:用最少数量的箭引爆气球 - leetcode
题目描述:
有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstartxend之间的气球。你不知道气球的确切 y 坐标。

一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstartxend, 且满足 xstart ≤ x ≤ xend,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。

给你一个数组 points ,返回引爆所有气球所必须射出的 最小 弓箭数 。

题目归纳:

解题思路:
解法: 用最少数量的箭引爆气球 - leetcode官方题解
记区间左端点为 x i x_i xi,右端点为 y i y_i yi
(1)对数组按区间右端点,升序排序。
(2)每只箭都对准,当前右端点 y i y_i yi最靠左的气球,即射出位置 p o s = m i n ( y i ) pos = min(y_i) pos=min(yi)
(3)下一只箭瞄准的气球是,第一个 x i x_i xi大于上次射出 p o s pos pos的气球,射出位置是该气球的 y i y_i yi

class Solution:def findMinArrowShots(self, points: List[List[int]]) -> int:# 第一种解法还用到了burst数组,这里的解法利用数组的有序特性,一次遍历即可if not points:return 0points.sort(key=lambda balloon:balloon[1]) # 按右端点升序排列pos = points[0][1]          # 第1个瞄准的气球的右端点ans = 1                     # 第1只箭for i in range(1, len(points)):if points[i][0] > pos : # 找到了下一只箭瞄准的气球ans += 1pos = points[i][1]  # 瞄准该气球的右端点return ans

这篇关于Leetcod面试经典150题刷题记录 —— 区间篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/547498

相关文章

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import

hdu4417区间统计

给你一个数列{An},然后有m次查询,每次查询一段区间 [l,r] <= h 的值的个数。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamRead

hdu3333区间统计

题目大意:求一个区间内不重复数字的和,例如1 1 1 3,区间[1,4]的和为4。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc