leetcode contest 128
双周赛防水的一次,周赛难度超大的一次。
100270. 字符串的分数
给你一个字符串 s 。一个字符串的 分数 定义为相邻字符 ASCII 码差值绝对值的和。
请你返回 s 的 分数 。
示例 1:
输入:s = “hello”
输出:13
解释:
s 中字符的 ASCII 码分别为:'h' = 104 ,'e' = 101 ,'l' = 108 ,'o' = 111 。所以 s 的分数为 |104 - 101| + |101 - 108| + |108 - 108| + |108 - 111| = 3 + 7 + 0 + 3 = 13 。
示例 2:
输入:s = “zaz”
输出:50
解释:
s 中字符的 ASCII 码分别为:'z' = 122 ,'a' = 97 。所以 s 的分数为 |122 - 97| + |97 - 122| = 25 + 25 = 50 。
提示:
2 <= s.length <= 100s只包含小写英文字母。
地址
https://leetcode.cn/contest/biweekly-contest-128/problems/score-of-a-string/
题意
直接模拟
思路
- 直接相邻数字的差的和即可,返回即可。
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 表示给定字符串的长度。
- 空间复杂度:$O(1)$,。
代码
class Solution: |
impl Solution { |
100280. 覆盖所有点的最少矩形数目
给你一个二维整数数组 point ,其中 points[i] = [xi, yi] 表示二维平面内的一个点。同时给你一个整数 w 。你需要用矩形 覆盖所有 点。
每个矩形的左下角在某个点 (x1, 0) 处,且右上角在某个点 (x2, y2) 处,其中 x1 <= x2 且 y2 >= 0 ,同时对于每个矩形都 必须 满足 x2 - x1 <= w 。
如果一个点在矩形内或者在边上,我们说这个点被矩形覆盖了。
请你在确保每个点都 至少 被一个矩形覆盖的前提下,最少 需要多少个矩形。
注意:一个点可以被多个矩形覆盖。
示例 1:

输入:points = [[2,1],[1,0],[1,4],[1,8],[3,5],[4,6]], w = 1
输出:2
解释:
上图展示了一种可行的矩形放置方案:
- 一个矩形的左下角在
(1, 0),右上角在(2, 8)。 - 一个矩形的左下角在
(3, 0),右上角在(4, 8)。
示例 2:

输入:points = [[0,0],[1,1],[2,2],[3,3],[4,4],[5,5],[6,6]], w = 2
输出:3
解释:
上图展示了一种可行的矩形放置方案:
- 一个矩形的左下角在
(0, 0),右上角在(2, 2)。 - 一个矩形的左下角在
(3, 0),右上角在(5, 5)。 - 一个矩形的左下角在
(6, 0),右上角在(6, 6)。
示例 3:

输入:points = [[2,3],[1,2]], w = 0
输出:2
解释:
上图展示了一种可行的矩形放置方案:
- 一个矩形的左下角在
(1, 0),右上角在(1, 2)。 - 一个矩形的左下角在
(2, 0),右上角在(2, 3)。
提示:
1 <= points.length <= 105points[i].length == 20 <= xi == points[i][0] <= 1090 <= yi == points[i][1] <= 1090 <= w <= 109- 所有点坐标
(xi, yi)互不相同。
地址
https://leetcode.cn/contest/biweekly-contest-128/problems/minimum-rectangles-to-cover-points/
题意
排序
思路
- 不晓得这个题目出的有什么意思,我们每次尝试用一个 $[x, x+w]$ 的窗口去覆盖当前的坐标区域,如果当前坐标 $i$ 无法被覆盖,此时我们再增加一个新的矩形 $[x_i,x_i+w]$ 来进行覆盖,统计需要增加的矩形数目即可。
- 复杂度分析:
- 时间复杂度:$O(n \times \log n)$,其中 $n$ 表示给定数组的长度。
- 空间复杂度:$O(1)$。
代码
class Solution: |
impl Solution { |
3112. 访问消失节点的最少时间
给你一个二维数组 edges 表示一个 n 个点的无向图,其中 edges[i] = [ui, vi, lengthi] 表示节点 ui 和节点 vi 之间有一条需要 lengthi 单位时间通过的无向边。
同时给你一个数组 disappear ,其中 disappear[i] 表示节点 i 从图中消失的时间点,在那一刻及以后,你无法再访问这个节点。
注意,图有可能一开始是不连通的,两个节点之间也可能有多条边。
请你返回数组 answer ,answer[i] 表示从节点 0 到节点 i 需要的 最少 单位时间。如果从节点 0 出发 无法 到达节点 i ,那么 answer[i] 为 -1 。
示例 1:

输入:n = 3, edges = [[0,1,2],[1,2,1],[0,2,4]], disappear = [1,1,5]
输出:[0,-1,4]
解释:
我们从节点 0 出发,目的是用最少的时间在其他节点消失之前到达它们。
- 对于节点 0 ,我们不需要任何时间,因为它就是我们的起点。
- 对于节点 1 ,我们需要至少 2 单位时间,通过
edges[0]到达。但当我们到达的时候,它已经消失了,所以我们无法到达它。 - 对于节点 2 ,我们需要至少 4 单位时间,通过
edges[2]到达。
示例 2:

输入:n = 3, edges = [[0,1,2],[1,2,1],[0,2,4]], disappear = [1,3,5]
输出:[0,2,3]
解释:
我们从节点 0 出发,目的是用最少的时间在其他节点消失之前到达它们。
- 对于节点 0 ,我们不需要任何时间,因为它就是我们的起点。
- 对于节点 1 ,我们需要至少 2 单位时间,通过
edges[0]到达。 - 对于节点 2 ,我们需要至少 3 单位时间,通过
edges[0]和edges[1]到达。
示例 3:
输入:n = 2, edges = [[0,1,1]], disappear = [1,1]
输出:[0,-1]
解释:
当我们到达节点 1 的时候,它恰好消失,所以我们无法到达节点 1 。
提示:
1 <= n <= 5 * 1040 <= edges.length <= 105edges[i] == [ui, vi, lengthi]0 <= ui, vi <= n - 11 <= lengthi <= 105disappear.length == n1 <= disappear[i] <= 105
地址
https://leetcode.cn/contest/weekly-contest-391/problems/count-alternating-subarrays/
题意
dijistra
思路
典型的
dijistra求最短距离的模版题目,感觉没有什么好说的,照着写即可;复杂度:
- 时间复杂度:$O(n \log n)$,其中 $n$ 表示给定数组的长度;
- 空间复杂度:$O(1)$;
代码
class Solution { |
from collections import defaultdict |
100273. 边界元素是最大值的子数组数目
给你一个 正 整数数组 nums 。
请你求出 nums 中有多少个子数组,满足子数组中 第一个 和 最后一个 元素都是这个子数组中的 最大 值。
示例 1:
输入:nums = [1,4,3,3,2]
输出:6
解释:
总共有 6 个子数组满足第一个元素和最后一个元素都是子数组中的最大值:
- 子数组
[***1***,4,3,3,2],最大元素为 1 ,第一个和最后一个元素都是 1 。 - 子数组
[1,***4***,3,3,2],最大元素为 4 ,第一个和最后一个元素都是 4 。 - 子数组
[1,4,***3***,3,2],最大元素为 3 ,第一个和最后一个元素都是 3 。 - 子数组
[1,4,3,***3***,2],最大元素为 3 ,第一个和最后一个元素都是 3 。 - 子数组
[1,4,3,3,***2***],最大元素为 2 ,第一个和最后一个元素都是 2 。 - 子数组
[1,4,***3,3***,2],最大元素为 3 ,第一个和最后一个元素都是 3 。
所以我们返回 6 。
示例 2:
输入:nums = [3,3,3]
输出:6
解释:
总共有 6 个子数组满足第一个元素和最后一个元素都是子数组中的最大值:
- 子数组
[***3***,3,3],最大元素为 3 ,第一个和最后一个元素都是 3 。 - 子数组
[3,***3***,3],最大元素为 3 ,第一个和最后一个元素都是 3 。 - 子数组
[3,3,***3***],最大元素为 3 ,第一个和最后一个元素都是 3 。 - 子数组
[***3,3***,3],最大元素为 3 ,第一个和最后一个元素都是 3 。 - 子数组
[3,***3,3***],最大元素为 3 ,第一个和最后一个元素都是 3 。 - 子数组
[***3,3,3***],最大元素为 3 ,第一个和最后一个元素都是 3 。
所以我们返回 6 。
示例 3:
输入:nums = [1]
输出:1
解释:
nums 中只有一个子数组 [***1***] ,最大元素为 1 ,第一个和最后一个元素都是 1 。
所以我们返回 1 。
提示:
1 <= nums.length <= 1051 <= nums[i] <= 109
地址
https://leetcode.cn/contest/biweekly-contest-128/
题意
单调栈
思路
题目确实比较模版,对于每个 $nums[i]$$ 我们只需要找到其坐标第一个大于等于 $ $nums[i]$ 的值 $nums[j]$,此时:
- $nums[j] = nums[i]$,此时以 $nums[i]$ 为结尾的子数组的数目即等于以 $nums[j]$ 为结尾的子数组的数目加 $1$;
- $nums[j] > nums[i]$,此时以 $nums[i]$ 为结尾的子数组的数目即等于 $1$;
使用单调栈检测左侧第一个大于等于 $nums[i]$ 的值 $nums[j]$ 是否等于 $nums[i]$ 即可,当然我们还可以排序,按照从大到小的顺序来依次遍历数组,此时 $nums[i] = nums[j]$,我们可以利用二分查找检测 $[i,j]$ 中是否含有大于 $nums[i]$ 的元素即可。
复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 表示数组的长度;
- 空间复杂度:$O(n)$,其中 $n$ 表示数组的长度;
代码
class Solution: |
impl Solution { |
欢迎关注和打赏,感谢支持!
关注我的博客: https://mike-box.github.io/
关注我的微信公众号: 哪些奋斗者

扫描二维码,分享此文章