leetcode weekly contest 308
竞赛手速场了,没啥好说的,都是常规题目。
6160. 和有限的最长子序列
题目
给你一个长度为 n
的整数数组 nums
,和一个长度为 m
的整数数组 queries
。
返回一个长度为 m
的数组 answer
,其中 answer[i]
是 nums
中 元素之和小于等于 queries[i]
的 子序列 的 最大 长度 。
子序列 是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。
示例 1:
输入:nums = [4,5,2,1], queries = [3,10,21] |
示例 2:
输入:nums = [2,3,4,5], queries = [1] |
提示:
n == nums.length
m == queries.length
1 <= n, m <= 1000
1 <= nums[i], queries[i] <= 106
地址
https://leetcode.cn/contest/weekly-contest-308/problems/longest-subsequence-with-limited-sum/
题意
贪心算法
思路
- 题目太简单了,由于不需要子序列有序,就非常简单了,直接将数组 $nums$ 排序,长度为 $i$ 的子序列的最小和即为前 $i$ 项元素的和,我们依次贪心的尝试前 $i$ 项的和小于等于 $queries[i]$ 的最大 $i$ 即可。
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 表示数组的长度。
- 空间复杂度:$O(n \log n)$。
代码
class Solution { |
6161. 从字符串中移除星号
题目
给你一个包含若干星号 *
的字符串 s
。
在一步操作中,你可以:
- 选中
s
中的一个星号。 - 移除星号 左侧 最近的那个 非星号 字符,并移除该星号自身。
返回移除 所有 星号之后的字符串。
注意:
- 生成的输入保证总是可以执行题面中描述的操作。
- 可以证明结果字符串是唯一的。
示例 1:
输入:s = "leet**cod*e" |
示例 2:
输入:s = "erase*****" |
提示:
1 <= s.length <= 105
s
由小写英文字母和星号*
组成s
可以执行上述操作
地址
https://leetcode.cn/contest/weekly-contest-308/problems/removing-stars-from-a-string/
题意
栈
思路
- 跟左右括号匹配一个原理,无脑用栈求解即可,与到
*
从栈中弹出一个元素即可。 - 复杂度分析:
- 时间复杂度:时间复杂度为 $O(n)$,$n$ 表示字符串的长度。
- 空间复杂度:时间复杂度为 $O(n)$,$n$ 表示字符串的长度。
代码
class Solution { |
6162. 收集垃圾的最少总时间
题目
给你一个下标从 0 开始的字符串数组 garbage
,其中 garbage[i]
表示第 i
个房子的垃圾集合。garbage[i]
只包含字符 'M'
,'P'
和 'G'
,但可能包含多个相同字符,每个字符分别表示一单位的金属、纸和玻璃。垃圾车收拾 一 单位的任何一种垃圾都需要花费 1
分钟。
同时给你一个下标从 0 开始的整数数组 travel
,其中 travel[i]
是垃圾车从房子 i
行驶到房子 i + 1
需要的分钟数。
城市里总共有三辆垃圾车,分别收拾三种垃圾。每辆垃圾车都从房子 0
出发,按顺序 到达每一栋房子。但它们 不是必须 到达所有的房子。
任何时刻只有 一辆 垃圾车处在使用状态。当一辆垃圾车在行驶或者收拾垃圾的时候,另外两辆车 不能 做任何事情。
请你返回收拾完所有垃圾需要花费的 最少 总分钟数。
示例 1:
输入:garbage = ["G","P","GP","GG"], travel = [2,4,3] |
示例 2:
输入:garbage = ["MMM","PGM","GP"], travel = [3,10] |
提示:
2 <= garbage.length <= 105
garbage[i]
只包含字母'M'
,'P'
和'G'
。1 <= garbage[i].length <= 10
travel.length == garbage.length - 1
1 <= travel[i] <= 100
地址
https://leetcode.cn/contest/weekly-contest-308/problems/minimum-amount-of-time-to-collect-garbage/
题意
直接遍历
思路
- 题目出的非常奇怪,不知道想考什么,由于任何时间只有一辆车辆可以行动,所以根本不能在最优调动什么的,直接暴力计算每种垃圾车的运行的最短时间即可,稍微有点技巧的是需要注意到垃圾车不必走到最后一栋房子,只需要清理完最后一栋含有该垃圾的房子即可停止即可。
- 时间复杂度:时间复杂度为 $O(n)$,$n$ 为节点数目。
- 空间复杂度:空间复杂度为 $O(n)$,$n$ 为节点数目。
代码
class Solution { |
6163. 给定条件下构造矩阵
题目
给你一个 正 整数 k
,同时给你:
- 一个大小为
n
的二维整数数组rowConditions
,其中rowConditions[i] = [abovei, belowi]
和 - 一个大小为
m
的二维整数数组colConditions
,其中colConditions[i] = [lefti, righti]
。
两个数组里的整数都是 1
到 k
之间的数字。
你需要构造一个 k x k
的矩阵,1
到 k
每个数字需要 恰好出现一次 。剩余的数字都是 0
。
矩阵还需要满足以下条件:
- 对于所有
0
到n - 1
之间的下标i
,数字abovei
所在的 行 必须在数字belowi
所在行的上面。 - 对于所有
0
到m - 1
之间的下标i
,数字lefti
所在的 列 必须在数字righti
所在列的左边。
返回满足上述要求的 任意 矩阵。如果不存在答案,返回一个空的矩阵。
示例 1:
输入:k = 3, rowConditions = [[1,2],[3,2]], colConditions = [[2,1],[3,2]] |
示例 2:
输入:k = 3, rowConditions = [[1,2],[2,3],[3,1],[2,3]], colConditions = [[2,1]] |
提示:
2 <= k <= 400
1 <= rowConditions.length, colConditions.length <= 104
rowConditions[i].length == colConditions[i].length == 2
1 <= abovei, belowi, lefti, righti <= k
abovei != belowi
lefti != righti
地址
https://leetcode.cn/contest/weekly-contest-308/problems/build-a-matrix-with-conditions/
题意
拓扑排序
思路
- 简单的拓扑排序即可,首先我们观察一下行的顺序与列的顺序是互相分离的,互相不影响的,因此我们可以先计算出每个元素所处的行的位置,再计算出每个元素所处的列的位置解,这样即可得到元素 $1, 2 , \cdots, k$ 的行坐标与列坐标。
- 行或者列的依赖关系我们可以转换为有向图,如果行 $x$ 在行 $y$ 的上方,则有有向变从 $x$ 指向 $y$,此时只需要求出所有行或者列的先后顺序即可,此时我们很容易的用拓扑排序求出即可,此时我们即求出元素 $1, 2 , \cdots, k$ 的行或者列的顺序,最后将元素写会矩阵即可。需要注意的是如果拓扑排序失败,则表明依赖关系存在矛盾,直接返回空矩阵即可。
- 复杂度分析:
- 时间复杂度:$O(m + k^2)$,其中 $m$ 表示依赖关系数组的长度,$k$ 表示给定的 $k$。
- 空间复杂度:$O(k + m)$,其中 $m$ 表示依赖关系数组的长度,$k$ 表示给定的 $k$。
代码
class Solution { |
欢迎关注和打赏,感谢支持!
- 关注我的博客: http://mikemeng.org/
- 关注我的知乎:https://www.zhihu.com/people/da-hua-niu
- 关注我的微信公众号: 公务程序猿
扫描二维码,分享此文章