leetcode contest 341
T4感觉比较难一些,前三题太水的题目。
6376. 一最多的行
给你一个大小为 m x n
的二进制矩阵 mat
,请你找出包含最多 1 的行的下标(从 0 开始)以及这一行中 1 的数目。
如果有多行包含最多的 1 ,只需要选择 行下标最小 的那一行。
返回一个由行下标和该行中 1 的数量组成的数组。
示例 1:
输入:mat = [[0,1],[1,0]] |
示例 2:
输入:mat = [[0,0,0],[0,1,1]] |
示例 3:
输入:mat = [[0,0],[1,1],[0,0]] |
提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 100
mat[i][j]
为0
或1
地址
https://leetcode.cn/contest/weekly-contest-341/problems/row-with-maximum-ones/
题意
直接枚举
思路
- 求矩阵每行的元素和,并找到元素和最大的行即可。
- 复杂度分析:
- 时间复杂度:$O(m\times n)$。
- 空间复杂度:$O(1)$。
代码
class Solution { |
6350. 找出可整除性得分最大的整数
给你两个下标从 0 开始的整数数组 nums
和 divisors
。
divisors[i]
的 可整除性得分 等于满足 nums[j]
能被 divisors[i]
整除的下标 j
的数量。
返回 可整除性得分 最大的整数 divisors[i]
。如果有多个整数具有最大得分,则返回数值最小的一个。
示例 1:
输入:nums = [4,7,9,3,9], divisors = [5,2,3] |
示例 2:
输入:nums = [20,14,21,10], divisors = [5,7,5] |
示例 3:
输入:nums = [12], divisors = [10,16] |
提示:
1 <= nums.length, divisors.length <= 1000
1 <= nums[i], divisors[i] <= 109
地址
https://leetcode.cn/contest/weekly-contest-341/problems/find-the-maximum-divisibility-score/
题意
暴力枚举
思路
- 直接枚举即可,求每个整数被 $nums$ 整除的元素的统计数目,然后求出最大的即可,感觉就是个简单题目。
- 复杂度分析:
- 时间复杂度:$O(n \times m)$,其中 $n,m$ 为数组的长度。
- 空间复杂度:$O(\log n)$。其中 $n$ 为数组的长度。
代码
class Solution { |
6375. 构造有效字符串的最少插入数
给你一个字符串 word
,你可以向其中任何位置插入 “a”、”b” 或 “c” 任意次,返回使 word
有效 需要插入的最少字母数。
如果字符串可以由 “abc” 串联多次得到,则认为该字符串 有效 。
示例 1:
输入:word = "b" |
示例 2:
输入:word = "aaa" |
示例 3:
输入:word = "abc" |
提示:
1 <= word.length <= 50
word
仅由字母 “a”、”b” 和 “c” 组成。
地址
https://leetcode.cn/contest/weekly-contest-341/problems/minimum-additions-to-make-valid-string/
题意
动态规划
思路
- 设 $dp[i]$ 表示将前 $i$ 个字母变成 $abc$ 的序列的最小插入字符的数目,此时有以下几种情况:
- 当前的两个字符分别为 $”ab”,”ac”,”bc”$ 时,此时我们只需要在当前位置插入一个字符即可, $dp[i] = dp[i-2] + 1$;
- 当前的三个字符分别为 $”abc”$ 时,此时我们不需要插入字符 , $dp[i] = dp[i - 3] + 1 $;
- 其余情况我们需要插入两个字符,$dp[i] = dp[i - 1] + 2$;
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 为字符串的长度。
- 空间复杂度:$O(n)$,其中 $n$ 为字符串的长度。
代码
class Solution { |
6378. 最小化旅行的价格总和
现有一棵无向、无根的树,树中有 n
个节点,按从 0
到 n - 1
编号。给你一个整数 n
和一个长度为 n - 1
的二维整数数组 edges
,其中 edges[i] = [ai, bi]
表示树中节点 ai
和 bi
之间存在一条边。
每个节点都关联一个价格。给你一个整数数组 price
,其中 price[i]
是第 i
个节点的价格。
给定路径的 价格总和 是该路径上所有节点的价格之和。
另给你一个二维整数数组 trips
,其中 trips[i] = [starti, endi]
表示您从节点 starti
开始第 i
次旅行,并通过任何你喜欢的路径前往节点 endi
。
在执行第一次旅行之前,你可以选择一些 非相邻节点 并将价格减半。
返回执行所有旅行的最小价格总和。
示例 1:
输入:n = 4, edges = [[0,1],[1,2],[1,3]], price = [2,2,10,6], trips = [[0,3],[2,1],[2,3]] |
示例 2:
输入:n = 2, edges = [[0,1]], price = [2,2], trips = [[0,0]] |
提示:
1 <= n <= 50
edges.length == n - 1
0 <= ai, bi <= n - 1
edges
表示一棵有效的树price.length == n
price[i]
是一个偶数1 <= price[i] <= 1000
1 <= trips.length <= 100
0 <= starti, endi <= n - 1
地址
https://leetcode.cn/contest/weekly-contest-341/problems/minimize-the-total-price-of-the-trips/
题意
树形dp
思路
首先我们可以观察到树中的所有路径均是确定的,即从 $x$ 到 $y$ 只有唯一的一条路径,在所有的行程中每个节点经过的次数是固定的,因此我们可以利用深度优先搜索将所有点的经过次数统计出来,而此时如果没有路径减半的操作,我们可以知道总的路径和为 :
$$
total = \sum_{i=0}^{n}price[i] * cnt[i]
$$如果数量减半,我们即将 $price[i]$ 除以 $2$ 即可,本题则编程了另一个经典题目打家劫舍 III,此时就变的非常简单了,树上的动态规划,感觉还是脑袋秀逗了,在这个 $tricky$ 的地方卡住了。
复杂度分析:
- 时间复杂度:$O(n^2 + m \times n)$,其中 $n$ 为节点的数目,$m$ 表示查询的次数。
- 空间复杂度:$O(n)$,其中 $n$ 为节点的数目。
代码
class Solution { |
欢迎关注和打赏,感谢支持!
- 关注我的博客: http://whistle-wind.com/
- 关注我的知乎:https://www.zhihu.com/people/da-hua-niu
- 关注我的微信公众号: 公务程序猿
扫描二维码,分享此文章