2023年10月刷题记录
2023年10月1日
【leetcode】121. 买卖股票的最佳时机
题意:
给定一个数组
prices
,它的第i
个元素prices[i]
表示一支给定股票第i
天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回
0
。
2023年10月2日
【leetcode】122. 买卖股票的最佳时机 II
题意:
给你一个整数数组
prices
,其中prices[i]
表示某支股票第i
天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
2023年10月3日
【leetcode】123. 买卖股票的最佳时机 III
题意:
给定一个数组,它的第
i
个元素是一支给定的股票在第i
天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
2023年10月4日
【leetcode】188. 买卖股票的最佳时机 IV
题意:
给你一个整数数组
prices
和一个整数k
,其中prices[i]
是某支给定的股票在第i
天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成
k
笔交易。也就是说,你最多可以买k
次,卖k
次。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
2023年10月5日
【leetcode】309. 买卖股票的最佳时机含冷冻期
题意:
给定一个整数数组
prices
,其中第prices[i]
表示第*i*
天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
- 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
2023年10月6日
【leetcode】714. 买卖股票的最佳时机含手续费
题意:
给定一个整数数组
prices
,其中prices[i]
表示第i
天的股票价格 ;整数fee
代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
返回获得利润的最大值。
注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。
2023年10月7日
【leetcode】901. 股票价格跨度
题意:
设计一个算法收集某些股票的每日报价,并返回该股票当日价格的 跨度 。
当日股票价格的 跨度 被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。
- 例如,如果未来 7 天股票的价格是
[100,80,60,70,60,75,85]
,那么股票跨度将是[1,1,1,2,1,4,6]
。实现
StockSpanner
类:
StockSpanner()
初始化类对象。int next(int price)
给出今天的股价price
,返回该股票当日价格的 跨度 。
2023年10月8日
【leetcode】2034. 股票价格波动
题意:
给你一支股票价格的数据流。数据流中每一条记录包含一个 时间戳 和该时间点股票对应的 价格 。
不巧的是,由于股票市场内在的波动性,股票价格记录可能不是按时间顺序到来的。某些情况下,有的记录可能是错的。如果两个有相同时间戳的记录出现在数据流中,前一条记录视为错误记录,后出现的记录 更正 前一条错误的记录。
请你设计一个算法,实现:
- 更新 股票在某一时间戳的股票价格,如果有之前同一时间戳的价格,这一操作将 更正 之前的错误价格。
- 找到当前记录里 最新股票价格 。最新股票价格 定义为时间戳最晚的股票价格。
- 找到当前记录里股票的 最高价格 。
- 找到当前记录里股票的 最低价格 。
请你实现
StockPrice
类:
StockPrice()
初始化对象,当前无股票价格记录。void update(int timestamp, int price)
在时间点timestamp
更新股票价格为price
。int current()
返回股票 最新价格 。int maximum()
返回股票 最高价格 。int minimum()
返回股票 最低价格 。
2023年10月9日
【leetcode】2578. 最小和分割
题意:
给你一个正整数
num
,请你将它分割成两个非负整数num1
和num2
,满足:
num1
和num2
直接连起来,得到num
各数位的一个排列。
- 换句话说,
num1
和num2
中所有数字出现的次数之和等于num
中所有数字出现的次数。num1
和num2
可以包含前导 0 。请你返回
num1
和num2
可以得到的和的 最小 值。注意:
num
保证没有前导 0 。num1
和num2
中数位顺序可以与num
中数位顺序不同。
2023年10月10日
【leetcode】2731. 移动机器人
题意:
有一些机器人分布在一条无限长的数轴上,他们初始坐标用一个下标从 0 开始的整数数组
nums
表示。当你给机器人下达命令时,它们以每秒钟一单位的速度开始移动。给你一个字符串
s
,每个字符按顺序分别表示每个机器人移动的方向。'L'
表示机器人往左或者数轴的负方向移动,'R'
表示机器人往右或者数轴的正方向移动。当两个机器人相撞时,它们开始沿着原本相反的方向移动。
请你返回指令重复执行
d
秒后,所有机器人之间两两距离之和。由于答案可能很大,请你将答案对109 + 7
取余后返回。注意:
- 对于坐标在
i
和j
的两个机器人,(i,j)
和(j,i)
视为相同的坐标对。也就是说,机器人视为无差别的。- 当机器人相撞时,它们 立即改变 它们的前进方向,这个过程不消耗任何时间。
- 当两个机器人在同一时刻占据相同的位置时,就会相撞。
- 例如,如果一个机器人位于位置 0 并往右移动,另一个机器人位于位置 2 并往左移动,下一秒,它们都将占据位置 1,并改变方向。再下一秒钟后,第一个机器人位于位置 0 并往左移动,而另一个机器人位于位置 2 并往右移动。
- 例如,如果一个机器人位于位置 0 并往右移动,另一个机器人位于位置 1 并往左移动,下一秒,第一个机器人位于位置 0 并往左行驶,而另一个机器人位于位置 1 并往右移动。
2023年10月11日
【leetcode】2512. 奖励最顶尖的 K 名学生
题意:
给你两个字符串数组
positive_feedback
和negative_feedback
,分别包含表示正面的和负面的词汇。不会 有单词同时是正面的和负面的。一开始,每位学生分数为
0
。每个正面的单词会给学生的分数 加3
分,每个负面的词会给学生的分数 减1
分。给你
n
个学生的评语,用一个下标从 0 开始的字符串数组report
和一个下标从 0 开始的整数数组student_id
表示,其中student_id[i]
表示这名学生的 ID ,这名学生的评语是report[i]
。每名学生的 ID 互不相同。给你一个整数
k
,请你返回按照得分 从高到低 最顶尖的k
名学生。如果有多名学生分数相同,ID 越小排名越前。
2023年10月12日
【leetcode】2562. 找出数组的串联值
题意:
给你一个下标从 0 开始的整数数组
nums
。现定义两个数字的 串联 是由这两个数值串联起来形成的新数字。
- 例如,
15
和49
的串联是1549
。
nums
的 串联值 最初等于0
。执行下述操作直到nums
变为空:
- 如果
nums
中存在不止一个数字,分别选中nums
中的第一个元素和最后一个元素,将二者串联得到的值加到nums
的 串联值 上,然后从nums
中删除第一个和最后一个元素。- 如果仅存在一个元素,则将该元素的值加到
nums
的串联值上,然后删除这个元素。返回执行完所有操作后
nums
的串联值。
2023年10月13日
【leetcode】1488. 避免洪水泛滥
题意:
你的国家有无数个湖泊,所有湖泊一开始都是空的。当第
n
个湖泊下雨前是空的,那么它就会装满水。如果第n
个湖泊下雨前是 满的 ,这个湖泊会发生 洪水 。你的目标是避免任意一个湖泊发生洪水。给你一个整数数组
rains
,其中:
rains[i] > 0
表示第i
天时,第rains[i]
个湖泊会下雨。rains[i] == 0
表示第i
天没有湖泊会下雨,你可以选择 一个 湖泊并 抽干 这个湖泊的水。请返回一个数组
ans
,满足:
ans.length == rains.length
- 如果
rains[i] > 0
,那么ans[i] == -1
。- 如果
rains[i] == 0
,ans[i]
是你第i
天选择抽干的湖泊。如果有多种可行解,请返回它们中的 任意一个 。如果没办法阻止洪水,请返回一个 空的数组 。
请注意,如果你选择抽干一个装满水的湖泊,它会变成一个空的湖泊。但如果你选择抽干一个空的湖泊,那么将无事发生。
2023年10月14日
【leetcode】136. 只出现一次的数字
题意:
给你一个 非空 整数数组
nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
2023年10月15日
【leetcode】137. 只出现一次的数字 II
题意:
给你一个整数数组
nums
,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。
2023年10月16日
【leetcode】260. 只出现一次的数字 III
题意:
给你一个整数数组
nums
,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。
2023年10月17日
【leetcode】2652. 倍数求和
题意:
给你一个正整数
n
,请你计算在[1,n]
范围内能被3
、5
、7
整除的所有整数之和。返回一个整数,用于表示给定范围内所有满足约束条件的数字之和。
2023年10月18日
【leetcode】2530. 执行 K 次操作后的最大分数
题意:
给你一个下标从 0 开始的整数数组
nums
和一个整数k
。你的 起始分数 为0
。在一步 操作 中:
- 选出一个满足
0 <= i < nums.length
的下标i
,- 将你的 分数 增加
nums[i]
,并且- 将
nums[i]
替换为ceil(nums[i] / 3)
。返回在 恰好 执行
k
次操作后,你可能获得的最大分数。向上取整函数
ceil(val)
的结果是大于或等于val
的最小整数。
2023年10月19日
【leetcode】1726. 同积元组
题意:
给你一个由 不同 正整数组成的数组
nums
,请你返回满足a * b = c * d
的元组(a, b, c, d)
的数量。其中a
、b
、c
和d
都是nums
中的元素,且a != b != c != d
。
2023年10月20日
【leetcode】2525. 根据规则将箱子分类
题意:
给你四个整数
length
,width
,height
和mass
,分别表示一个箱子的三个维度和质量,请你返回一个表示箱子 类别 的字符串。
- 如果满足以下条件,那么箱子是
"Bulky"
的:
- 箱子 至少有一个 维度大于等于
104
。- 或者箱子的 体积 大于等于
109
。- 如果箱子的质量大于等于
100
,那么箱子是"Heavy"
的。- 如果箱子同时是
"Bulky"
和"Heavy"
,那么返回类别为"Both"
。- 如果箱子既不是
"Bulky"
,也不是"Heavy"
,那么返回类别为"Neither"
。- 如果箱子是
"Bulky"
但不是"Heavy"
,那么返回类别为"Bulky"
。- 如果箱子是
"Heavy"
但不是"Bulky"
,那么返回类别为"Heavy"
。注意,箱子的体积等于箱子的长度、宽度和高度的乘积。
2023年10月21日
【leetcode】2316. 统计无向图中无法互相到达点对数
题意:
给你一个整数
n
,表示一张 无向图 中有n
个节点,编号为0
到n - 1
。同时给你一个二维整数数组edges
,其中edges[i] = [ai, bi]
表示节点ai
和bi
之间有一条 无向 边。请你返回 无法互相到达 的不同 点对数目 。
2023年10月22日
【leetcode】1402. 做菜顺序
题意:
一个厨师收集了他
n
道菜的满意程度satisfaction
,这个厨师做出每道菜的时间都是 1 单位时间。一道菜的 「 like-time 系数 」定义为烹饪这道菜结束的时间(包含之前每道菜所花费的时间)乘以这道菜的满意程度,也就是
time[i]
*satisfaction[i]
。返回厨师在准备了一定数量的菜肴后可以获得的最大 like-time 系数 总和。
你可以按 任意 顺序安排做菜的顺序,你也可以选择放弃做某些菜来获得更大的总和。
2023年10月23日
【leetcode】2678. 老人的数目
题意:
给你一个下标从 0 开始的字符串
details
。details
中每个元素都是一位乘客的信息,信息用长度为15
的字符串表示,表示方式如下:
- 前十个字符是乘客的手机号码。
- 接下来的一个字符是乘客的性别。
- 接下来两个字符是乘客的年龄。
- 最后两个字符是乘客的座位号。
请你返回乘客中年龄 严格大于 60 岁 的人数。
2023年10月24日
【leetcode】1155. 掷骰子等于目标和的方法数
题意:
这里有
n
个一样的骰子,每个骰子上都有k
个面,分别标号为1
到k
。给定三个整数
n
,k
和target
,返回可能的方式(从总共k^n
种方式中)滚动骰子的数量,使正面朝上的数字之和等于target
。答案可能很大,你需要对
10^9 + 7
取模 。
2023年10月25日
【leetcode】2698. 求一个整数的惩罚数
题意:
给你一个正整数
n
,请你返回n
的 惩罚数 。
n
的 惩罚数 定义为所有满足以下条件i
的数的平方和:
1 <= i <= n
i * i
的十进制表示的字符串可以分割成若干连续子字符串,且这些子字符串对应的整数值之和等于i
。
2023年10月26日
【leetcode】2520. 统计能整除数字的位数
题意:
给你一个整数
num
,返回num
中能整除num
的数位的数目。如果满足
nums % val == 0
,则认为整数val
可以整除nums
。
2023年10月27日
【leetcode】1465. 切割后面积最大的蛋糕
题意:
矩形蛋糕的高度为
h
且宽度为w
,给你两个整数数组horizontalCuts
和verticalCuts
,其中:
horizontalCuts[i]
是从矩形蛋糕顶部到第i
个水平切口的距离verticalCuts[j]
是从矩形蛋糕的左侧到第j
个竖直切口的距离请你按数组
horizontalCuts
和verticalCuts
中提供的水平和竖直位置切割后,请你找出 面积最大 的那份蛋糕,并返回其 面积 。由于答案可能是一个很大的数字,因此需要将结果 对10^9 + 7
取余 后返回。
2023年10月28日
【leetcode】2558. 从数量最多的堆取走礼物
题意:
给你一个整数数组
gifts
,表示各堆礼物的数量。每一秒,你需要执行以下操作:
- 选择礼物数量最多的那一堆。
- 如果不止一堆都符合礼物数量最多,从中选择任一堆即可。
- 选中的那一堆留下平方根数量的礼物(向下取整),取走其他的礼物。
返回在
k
秒后剩下的礼物数量。
2023年10月29日
【leetcode】274. H 指数
题意:
给你一个整数数组
citations
,其中citations[i]
表示研究者的第i
篇论文被引用的次数。计算并返回该研究者的h
指数。根据维基百科上 h 指数的定义:
h
代表“高引用次数” ,一名科研人员的h
指数 是指他(她)至少发表了h
篇论文,并且每篇论文 至少 被引用h
次。如果h
有多种可能的值,h
指数 是其中最大的那个。
2023年10月30日
【leetcode】275. H 指数 II
题意:
给你一个整数数组
citations
,其中citations[i]
表示研究者的第i
篇论文被引用的次数,citations
已经按照 升序排列 。计算并返回该研究者的 h 指数。h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的
h
指数是指他(她)的 (n
篇论文中)总共有h
篇论文分别被引用了至少h
次。请你设计并实现对数时间复杂度的算法解决此问题。
2023年10月31日
【leetcode】2003. 每棵子树内缺失的最小基因值
题意:
有一棵根节点为
0
的 家族树 ,总共包含n
个节点,节点编号为0
到n - 1
。给你一个下标从 0 开始的整数数组parents
,其中parents[i]
是节点i
的父节点。由于节点0
是 根 ,所以parents[0] == -1
。总共有
105
个基因值,每个基因值都用 闭区间[1, 105]
中的一个整数表示。给你一个下标从 0 开始的整数数组nums
,其中nums[i]
是节点i
的基因值,且基因值 互不相同 。请你返回一个数组
ans
,长度为n
,其中ans[i]
是以节点i
为根的子树内 缺失 的 最小 基因值。节点
x
为根的 子树 包含节点x
和它所有的 后代 节点。