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.lengthm == queries.length1 <= n, m <= 10001 <= 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 <= 105s由小写英文字母和星号*组成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 <= 105garbage[i]只包含字母'M','P'和'G'。1 <= garbage[i].length <= 10travel.length == garbage.length - 11 <= 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 <= 4001 <= rowConditions.length, colConditions.length <= 104rowConditions[i].length == colConditions[i].length == 21 <= abovei, belowi, lefti, righti <= kabovei != belowilefti != 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
- 关注我的微信公众号: 公务程序猿

扫描二维码,分享此文章