NeetCode刷题第21天(2025.2.4)

文章目录

  • 114 Gas Station 加油站
  • 115 Hand of Straights 顺子之手
  • 116 Merge Triplets to Form Target 将 Triplelet 合并到 Form Target
  • 117 Partition Labels 分区标签
  • 118 Valid Parenthesis String 有效的括号字符串
  • 119 Insert Interval 插入间隔
  • 120 Merge Intervals 合并区间
  • 121 Non-overlapping Intervals 非重叠区间
  • 122 Meeting Rooms II 会议室 II
  • 123 Rotate Image 旋转图片

114 Gas Station 加油站

沿着一条圆形路线有 n 个加油站。你会得到两个整数阵列的gas和cost,其中:

  • gas[i] 是第 i 个站点的 gas 量。
  • cost[i] 是从第 i 个加油站到第 (i + 1) 个加油站所需的汽油量。(最后一个站连接到第一个站)

您有一辆可以储存无限量汽油的汽车,但您在其中一个加油站以空油箱开始旅程。
返回起始加油站的索引,以便您可以按顺时针方向绕电路行驶一次。如果不可能,则返回 -1。
可以保证最多存在一个解决方案。

示例1:
Input: gas = [1,2,3,4], cost = [2,2,4,1]
Output: 3
说明:从第 3 站(索引 3)开始,加注 4 个单位的汽油。您的水箱 = 0 + 4 = 4
前往 0 号站。您的水箱 = 4 - 1 + 1 = 3
前往 1 号站。您的水箱 = 3 - 2 + 2 = 3
前往 2 号站。您的水箱 = 3 - 2 + 3 = 4
前往 3 号站。您的水箱 = 2 - 4 + 4 = 2示例2:
gas = [1,2,3], cost = [2,3,2]
Output: -1
说明:您不能从 0 或 1 号站开始,因为没有足够的汽油前往下一个站。
如果您从工号 2 开始,您可以移动到工号 0,然后移动到工号 1。
在站点 1,您的水箱 = 0 + 3 - 2 + 1 - 2 = 0。
您被困在第 1 站,因此无法绕着电路行驶。

解题1: 贪婪
在这里插入图片描述
这里用diff数组来存储油的加入和消耗之差,来判断是否可以从该位置出发。

class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:# 首先要保证汽油之和要大于消耗if sum(gas) < sum(cost):return -1total = 0res = 0for i in range(len(gas)):total += (gas[i] - cost[i])if total < 0:total = 0res = i + 1return res

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

115 Hand of Straights 顺子之手

您将得到一个整数数组hand和一个整数 groupSize,其中 hand [i] 是写在第i张卡片上的值。
您需要将卡片重新排列成组,以便每个组的卡片数量为 groupSize,并且卡片值连续增加 1。
如果可以通过这种方式重新排列卡片,则返回 true ,否则返回 false 。

示例1:
Input: hand = [1,2,4,2,3,5,3,4], groupSize = 4
Output: true
说明:卡片可以重新排列为 [1,2,3,4] 和 [2,3,4,5] 。示例2:
Input: hand = [1,2,3,3,4,5,6,7], groupSize = 4
Output: false
解释:我们能得到的最接近的是 [1,2,3,4] 和 [3,5,6,7] ,但第二组中的牌不是连续的。

解题1:
在这里插入图片描述
我们首先用HashMap来存储每个数字的个数,每使用一个就把其对应的个数减一。同时用MinHeap来弹出最小值,同时当某个数在HashMap中的个数减少为0的时候,也将该数从最小堆中弹出。

class Solution:def isNStraightHand(self, hand: List[int], groupSize: int) -> bool:# 首先判断是否可以整除groupSizeif len(hand) % groupSize:return Falsecount = {}for n in hand:count[n] = 1 + count.get(n, 0)minH = list(count.keys())heapq.heapify(minH)while minH:first = minH[0]for i in range(first, first + groupSize):if i not in count:return Falsecount[i] -= 1if count[i] == 0:if i != minH[0]:return Falseheapq.heappop(minH)return True

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

116 Merge Triplets to Form Target 将 Triplelet 合并到 Form Target

你得到一个整数 triplelets 的二维数组,其中三元组[i] = [ai, bi, ci] 表示第 i 个三元组。你还会得到一个整数数组 target = [x, y, z],这是我们想要得到的三元组。
要获取 target,您可以对 triplelets 零次或多次应用以下作用:
选择两个不同的三元组 triplets[i] 和 triplets[j],并将 triplets[j] 更新为 [max(ai, aj), max(bi, bj), max(ci, cj)] 。
例如,如果三元组[i] = [1, 3, 1] 且三元组[j] = [2, 1, 2],则三元组[j]将更新为 [max(1, 2), max(3, 1), max(1, 2)] = [2, 3, 2] 。
如果可以将 target 作为三元组的元素获取,则返回 true,否则返回 false。

示例1:
Input: triplets = [[1,2,3],[7,1,1]], target = [7,2,3]
Output: true
解释:选择第一个和第二个三元组,将第二个三元组更新为 [max(1, 7), max(2, 1), max(3, 1)] = [7, 2, 3]。示例2:
Input: triplets = [[2,5,6],[1,4,4],[5,7,5]], target = [5,4,6]
Output: false
解释:

解题1: 贪婪

class Solution:def mergeTriplets(self, triplets: List[List[int]], target: List[int]) -> bool:good = set()for t in triplets:if t[0] > target[0] or t[1] > target[1] or t[2] > target[2]:continuefor i, v in enumerate(t):if v == target[i]:good.add(i)return len(good) == 3

时间复杂度: O ( n 2 ) O(n²) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)

117 Partition Labels 分区标签

你被给了一个由小写英文字母组成的字符串 s 。
我们希望尽可能地将字符串分割成多个子字符串,同时确保每个字母最多只出现在一个子字符串中。
返回一个表示这些子字符串大小的整数列表,按其在字符串中出现的顺序排列。

示例1:
Input: s = "xyxxyzbzbbisl"
Output: [5, 5, 1, 1, 1]
解释:字符串可以被分割为 ["xyxxy", "zbzbb", "i", "s", "l"] 。示例2:
Input: s = "abcabc"
Output: [6]

解题1: 双指针(贪心)
在这里插入图片描述
这里设置一个HashMap来映射每个字母最后出现的位置索引。
size用来记录substring的长度,同时用来检查改位置的字母最后一次出现的索引是不是小于end,如果不是需要修改end的值。

class Solution:def partitionLabels(self, s: str) -> List[int]:lastIndex = {} # char -> last index in sfor i, c in enumerate(s):lastIndex[c] = ires = []size, end = 0, 0for i, c in enumerate(s):size += 1end = max(end, lastIndex[c])if i == end:res.append(size)size = 0return res

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( m ) O(m) O(m)
n 是字符串 s 的长度,而 m 是字符串 s 中唯一字符的数量。

118 Valid Parenthesis String 有效的括号字符串

您被给定一个字符串 s ,它只包含三种类型的字符: ‘(’ 、 ‘)’ 和 ‘*’ 。
返回 true 如果 s 有效,否则返回 false 。
一个字符串如果遵循以下所有规则,则是有效的:

  • 每个左括号 ‘(’ 都必须有一个相应的右括号 ‘)’ 。
  • 每个右括号 ‘)’ 都必须有一个对应的左括号 ‘(’ 。
  • 左括号 ‘(’ 必须在相应的右括号 ‘)’ 之前。
  • 一个 ‘*’ 可以被当作一个右括号 ‘)’ 字符或一个左括号 ‘(’ 字符,或者作为一个空字符串 “” 。
示例1:
Input: s = "((**)"
Output: true
解释:其中一个 '*' 可能是一个 ')' ,另一个可能是空字符串。示例2:
Input: s = "(((*)"
Output: false
说明:字符串无效,因为开头多了一个 '(' ,不管多出来的 '*' 。

解题1: 贪心算法

class Solution:def checkValidString(self, s: str) -> bool:leftMin, leftMax = 0, 0for c in s:if c == "(":leftMin, leftMax = leftMin + 1, leftMax + 1elif c == ")":leftMin, leftMax = leftMin - 1, leftMax - 1else:leftMin, leftMax = leftMin - 1, leftMax + 1if leftMax < 0:return Falseif leftMin < 0: # s = ( * ) (leftMin = 0return leftMin == 0

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

119 Insert Interval 插入间隔

您被给定一个非重叠区间数组 intervals ,其中 intervals[i] = [start_i, end_i] 表示 ith 区间的开始和结束时间。 intervals 最初按 start_i 升序排序。
您被赋予另一个区间 newInterval = [start, end] 。
将 newInterval 插入到 intervals 中,使得 intervals 仍然按 start_i 升序排列,并且 intervals 仍然没有重叠的区间。如果需要,可以合并重叠的区间。
返回 intervals 后添加 newInterval 。
注意:如果区间没有公共点,则它们是非重叠的。例如,[1,2] 和 [3,4] 是非重叠的,但 [1,2] 和 [2,3] 是重叠的。

示例1:
Input: intervals = [[1,3],[4,6]], newInterval = [2,5]
Output: [[1,6]]示例2:
Input: intervals = [[1,2],[3,5],[9,10]], newInterval = [6,7]
Output: [[1,2],[3,5],[6,7],[9,10]]

解题1: 贪心算法

class Solution:def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:res = []for i in range(len(intervals)):if newInterval[1] < intervals[i][0]:res.append(newInterval)return res + intervals[i:]elif newInterval[0] > intervals[i][1]:res.append(intervals[i])else:newInterval = [min(newInterval[0], intervals[i][0]), max(newInterval[1], intervals[i][1])]res.append(newInterval)return res

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

120 Merge Intervals 合并区间

给定一个数组 intervals ,其中 intervals[i] = [start_i, end_i] ,合并所有重叠的区间,并返回覆盖输入中所有区间的非重叠区间数组。
您可以将答案以任何顺序返回。
注意:如果区间没有公共点,则它们是非重叠的。例如, [1, 2] 和 [3, 4] 是非重叠的,但 [1, 2] 和 [2, 3] 是重叠的。

示例1:
Input: intervals = [[1,3],[1,5],[6,7]]
Output: [[1,5],[6,7]]示例2:
Input: intervals = [[1,2],[2,3]]
Output: [[1,3]]

解题1: 排序

class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:# O(nlogn) 首先需要从小到大进行排序intervals.sort(key = lambda i : i[0])output = [intervals[0]]for start, end in intervals[1:]:lastEnd = output[-1][1]# 判断是否有重叠if start <= lastEnd:output[-1][1] = max(lastEnd, end)else:output.append([start, end])return output

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度: O ( n ) O(n) O(n)

121 Non-overlapping Intervals 非重叠区间

给定一个区间数组 intervals ,其中 intervals[i] = [start_i, end_i] ,返回你需要移除的最小区间数,以使得剩余的区间不重叠。
注意:即使有共同点,区间也不会重叠。例如, [1, 3] 和 [2, 4] 是重叠的,但 [1, 2] 和 [2, 3] 是非重叠的。

示例1:
Input: intervals = [[1,2],[2,4],[1,4]]
Output: 1
解释:移除[1,4]之后,其余的区间都是非重叠的。示例2:
Input: intervals = [[1,2],[2,4]]
Output: 0

解题1: 贪心(按起始时间排序)

class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:intervals.sort()res = 0prevEnd = intervals[0][1]for start, end in intervals[1:]:# 如果没有重叠if start >= prevEnd:prevEnd = endelse:res += 1prevEnd = min(end, prevEnd)return res

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度: O ( 1 ) 或 O ( n ) O(1) 或 O(n) O(1)O(n),取决于排序算法。

122 Meeting Rooms II 会议室 II

给定一个包含会议时间间隔对象的数组,这些对象包括开始和结束时间,求在不发生任何冲突的情况下安排所有会议所需的最少天数。

示例1:
Input: intervals = [(0,40),(5,10),(15,20)]
Output: 2
解释:
day1: (0,40)
day2: (5,10),(15,20)示例2:
Input: intervals = [(4,9)]
Output: 1

解题1: 双指针
在这里插入图片描述
当我们进行遍历时,首先0开始,然后时5。当遍历到5的时候,发现0-30这个会议还没有结束。所以count+1。
在这里插入图片描述
当我们继续,到10的时候,一个会议结束,count-1。再继续,到15的时候,因为0-30这个还没有结束,所以count+1。
在这里插入图片描述
用双指针,每次比较start和end中的值,取小的那个,如果小的在start,那么count+1,否则count-1。
当都遇到10的时候,因为要一个会议结束,另一个才能开始。所以这里,end中的指针要+1,count要-1。

"""
Definition of Interval:
class Interval(object):def __init__(self, start, end):self.start = startself.end = end
"""class Solution:def minMeetingRooms(self, intervals: List[Interval]) -> int:start = sorted([i.start for i in intervals])end = sorted([i.end for i in intervals])res, count = 0, 0s, e = 0, 0# 只要遍历完satrt就可以停止while s < len(intervals):if start[s] < end[e]:s += 1count += 1else:e += 1count -= 1res = max(res, count)return res

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度: O ( n ) O(n) O(n)

123 Rotate Image 旋转图片

给定一个整数矩阵 n x n ,将其顺时针旋转 90 度。
您必须在原地旋转矩阵。不要分配另一个二维矩阵进行旋转。
在这里插入图片描述

示例1:
Input: matrix = [[1,2],[3,4]
]Output: [[3,1],[4,2]
]

在这里插入图片描述

示例2:
Input: matrix = [[1,2,3],[4,5,6],[7,8,9]
]
Output: [[7,4,1],[8,5,2],[9,6,3]
]

解题1: 旋转四格
在这里插入图片描述
从上图可以看出,一个n×n的矩阵,最外层旋转的次数不是n,而是n-1。
在这里插入图片描述
已经知道移动的步骤了,为了减少操作次数,我们可以先用一个临时变量来存储左上角的数,然后顺时针移动数字。

class Solution:def rotate(self, matrix: List[List[int]]) -> None:l, r = 0, len(matrix) - 1while l < r:for i in range(r - l):top, bottom = l, r# 保存左上角topLeft = matrix[top][l + i]# 左下移动到左上matrix[top][l + i] = matrix[bottom - i][l]# 右下到左下matrix[bottom - i][l] = matrix[bottom][r - i]# 右上到右下matrix[bottom][r - i] = matrix[top + i][r]# 左上到右上matrix[top + i][r] = topLeftr -= 1l += 1

时间复杂度: O ( n 2 ) O(n²) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)

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

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

相关文章

车载软件架构 --- 基于AUTOSAR软件架构的ECU开发流程小白篇

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

Ollama本地搭建大模型

短短一夜之间&#xff0c;中国的AI大模型DeepSeek迅速崛起&#xff0c;成功引起了全球科技界的广泛关注。 deepSeek爆火时间线 DeepSeek大事记 技术突破与产品发布 2024年12月26日&#xff1a;DeepSeek-V3发布&#xff0c;知识类任务水平提升&#xff0c;生成吐字速度加快。…

C#结合html2canvas生成切割图片并导出到PDF

目录 需求 开发运行环境 实现 生成HTML范例片断 HTML元素转BASE64 BASE64转图片 切割长图片 生成PDF文件 小结 需求 html2canvas 是一个 JavaScript 库&#xff0c;它可以把任意一个网页中的元素&#xff08;包括整个网页&#xff09;绘制到指定的 canvas 中&#xf…

【通俗易懂说模型】线性回归(附深度学习、机器学习发展史)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …

C#面试常考随笔12:游戏开发中常用的设计模式【C#面试题(中级篇)补充】

C#面试题&#xff08;中级篇&#xff09;&#xff0c;详细讲解&#xff0c;帮助你深刻理解&#xff0c;拒绝背话术&#xff01;-CSDN博客 简单工厂模式 优点&#xff1a; 根据条件有工厂类直接创建具体的产品 客户端无需知道具体的对象名字&#xff0c;可以通过配置文件创建…

大模型的底层逻辑及Transformer架构

一、大模型的底层逻辑 1.数据驱动 大模型依赖海量的数据进行训练&#xff0c;数据的质量和数量直接影响模型的性能。通过大量的数据&#xff0c;模型能够学习到丰富的模式和规律&#xff0c;从而更好地处理各种任务。 2.深度学习架构 大模型基于深度学习技术&#xff0c;通常…

C++ 学习:深入理解 Linux 系统中的冯诺依曼架构

一、引言 冯诺依曼架构是现代计算机系统的基础&#xff0c;它的提出为计算机的发展奠定了理论基础。在学习 C 和 Linux 系统时&#xff0c;理解冯诺依曼架构有助于我们更好地理解程序是如何在计算机中运行的&#xff0c;包括程序的存储、执行和资源管理。这对于编写高效、可靠…

【C++】STL——list底层实现

目录 &#x1f495;1.list的三个类介绍 &#x1f495;2.list——节点类 &#xff08;ListNode&#xff09; &#x1f495;3.list——链表类 &#xff08;List&#xff09; &#x1f495;4.list——迭代器类&#xff08;重点思考&#xff09;(ListIterator) &#x1f495;5…

deepseek、qwen等多种模型本地化部署

想要在本地部署deepseek、qwen等模型其实很简单,快跟着小编一起部署吧 1 环境搭建 1.1下载安装环境 首先我们需要搭建一个环境ollama,下载地址如下 :Ollama 点击Download 根据自己电脑的系统选择对应版本下载即可 1.2 安装环境(window为例) 可以直接点击安装包进行安…

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>黄金矿工

目录 决策树&#xff1a;代码设计代码&#xff1a; 决策树&#xff1a; 代码设计 代码&#xff1a; class Solution {boolean[][] vis;int ret,m,n;public int getMaximumGold(int[][] grid) {m grid.length;n grid[0].length;vis new boolean[m][n]; for(int i 0; i <…

基于springboot河南省旅游管理系统

基于Spring Boot的河南省旅游管理系统是一种专为河南省旅游行业设计的信息管理系统&#xff0c;旨在整合和管理河南省的旅游资源信息&#xff0c;为游客提供准确、全面的旅游攻略和服务。以下是对该系统的详细介绍&#xff1a; 一、系统背景与意义 河南省作为中国的中部省份&…

并发编程 - 线程同步(三)之原子操作Interlocked简介

上一章我们了解了3种处理多线程中共享资源安全的方法&#xff0c;今天我们将更近一步&#xff0c;学习一种针对简单线程同步场景的解决方案——Interlocked。 在此之前我们先学习一个概念——原子操作。 01、原子操作 原子操作&#xff0c;其概念源于化学领域&#xff0c;原子…

0205算法:最长连续序列、三数之和、排序链表

力扣128&#xff1a;最长连续序列 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 class Solution {public int longestConsecutive(in…

JAVA_内部类

定义&#xff1a;在类的内部再定义一个类 特点&#xff1a;内部类可以直接访问外部类中的成员变量&#xff0c;即使是私有的。 外部类要想访问内部类中的成员变量&#xff0c;必须先创建内部类对象。 什么时候使用内部类&#xff1a;B类是A类的一部分&#xff0c;且B单独存在没…

2024 JAVA面试题

第一章-Java基础篇 1、你是怎样理解OOP面向对象 面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征&#xff1a; 继承****&#xff1a;****继承是从已有类得到继承信息创建新类的过程 封装&#xff1a;封装是把数据和操作数据的方法绑定起来&#xff0c;对数据的…

视频融合平台EasyCVR无人机场景视频压缩及录像方案

安防监控视频汇聚EasyCVR平台在无人机场景中发挥着重要的作用&#xff0c;通过高效整合视频流接入、处理与分发等功能&#xff0c;为无人机视频数据的实时监控、存储与分析提供了全面支持&#xff0c;广泛应用于安防监控、应急救援、电力巡检、交通管理等领域。 EasyCVR支持GB…

2025最新软件测试面试大全

前面看到了一些面试题&#xff0c;总感觉会用得到&#xff0c;但是看一遍又记不住&#xff0c;所以我把面试题都整合在一起&#xff0c;都是来自各路大佬的分享&#xff0c;为了方便以后自己需要的时候刷一刷&#xff0c;不用再到处找题&#xff0c;今天把自己整理的这些面试题…

Hugging Face GGUF 模型可视化

Hugging Face GGUF 模型可视化 1. Finding GGUF files (检索 GGUF 模型)2. Viewer for metadata & tensors info (可视化 GGUF 模型)References 无知小儿&#xff0c;仙家雄霸天下&#xff0c;依附强者才是唯一的出路。否则天地虽大&#xff0c;也让你们无路可走&#xff0…

【C++】多态详细讲解

本篇来聊聊C面向对象的第三大特性-多态。 1.多态的概念 多态通俗来说就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态)。 编译时多态&#xff1a;主要就是我们前⾯讲的函数重载和函数模板&#xff0c;他们传不同类型的参数就可以调⽤不同的函数&#xff0c;通…

oracle 基础语法复习记录

Oracle SQL基础 学习范围 学习SQL基础语法 掌握SELECT、INSERT、UPDATE、DELETE等基本操作。 熟悉WHERE、GROUP BY、ORDER BY、HAVING等子句。 理解表连接&#xff1a; 学习INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN等连接方式。 掌握聚合函数&#xff1a; 熟悉…