leetcode biweekly contest 120
算是比较简单的双周赛的题目了,T3
有一些思考的性质的题目,其余都是简单题目。
2970. 统计移除递增子数组的数目 I
给你一个下标从 0 开始的 正 整数数组 nums
。
如果 nums
的一个子数组满足:移除这个子数组后剩余元素 严格递增 ,那么我们称这个子数组为 移除递增 子数组。比方说,[5, 3, 4, 6, 7]
中的 [3, 4]
是一个移除递增子数组,因为移除该子数组后,[5, 3, 4, 6, 7]
变为 [5, 6, 7]
,是严格递增的。
请你返回 nums
中 移除递增 子数组的总数目。
注意 ,剩余元素为空的数组也视为是递增的。
子数组 指的是一个数组中一段连续的元素序列。
示例 1:
输入:nums = [1,2,3,4] |
示例 2:
输入:nums = [6,5,7,8] |
示例 3:
输入:nums = [8,7,6,6] |
提示:
1 <= nums.length <= 50
1 <= nums[i] <= 50
地址
题意
模拟
思路
- 题目比较有意思的题目,其实我们仔细分析一下,去掉一个数组中的一个连续子数组使得数组中剩余的元素严格递增,实际我们有三种去除方法:
- 去掉数组中的前 $x$ 个元素,使得剩余元素 $nums[{x+1}\cdots{n-1}]$ 严格递增;
- 去掉数组中的后 $x$ 个元素,使得剩余元素 $nums[{0}\cdots{n-x-1}]$ 严格递增;
- 去掉数组中间的 $x$ 个元素,使得剩余元素 $nums[{0}\cdots{i}],nums[{i+x+1}\cdots{n-1}]$ 严格递增;
根据以上分析,我们分别检测这三种情况: - 去掉前面的元素,此时我们求出数组后部最长的严格递增的元素数组为 $nums[r\cdots{n-1}]$,此时可以构成的严格递增子数组可以为:
$$
nums[r\cdots n-1] \
nums[r + 1\cdots n-1] \
nums[r + 2\cdots n-1] \
\cdots \
nums[n-1] \
$$
一共可以有 $n-r$ 个严格递增子数组; - 去掉后面的元素,此时我们求出数组前部最长的严格递增的元素数组为 $nums[0\cdots{l}]$,此时可以构成的严格递增子数组可以为:
$$
nums[0\cdots l] \
nums[0\cdots l-1] \
nums[0\cdots l-2] \
\cdots \
nums[0] \
$$
一共可以有 $l + 1$ 个严格递增子数组; - 去掉中间的元素,此时假设数组的前半分数数组为 $nums[0 \cdots l]$,后半部分数组为 $nums[r \cdots n-1]$,此时需要严格保证
- $nums[0 \cdots l]$ 严格递增;
- $nums[r \cdots n-1]$ 严格递增;
- $nums[r] > nums[l]$;
实际此时我们可以用双指针,$l$ 指向数组的前半部分结尾, $r$ 指向后半部分的开头,此时移动左侧 $l$ 后,看存在多少 $r$ 满足 $nums[r] > nums[l]$;
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 表示给定数组的长度。
- 空间复杂度:$O(1)$。
代码
class Solution: |
2973. 树中每个节点放置的金币数目
给你一棵 n
个节点的 无向 树,节点编号为 0
到 n - 1
,树的根节点在节点 0
处。同时给你一个长度为 n - 1
的二维整数数组 edges
,其中 edges[i] = [ai, bi]
表示树中节点 ai
和 bi
之间有一条边。
给你一个长度为 n
下标从 0 开始的整数数组 cost
,其中 cost[i]
是第 i
个节点的 开销 。
你需要在树中每个节点都放置金币,在节点 i
处的金币数目计算方法如下:
- 如果节点
i
对应的子树中的节点数目小于3
,那么放1
个金币。 - 否则,计算节点
i
对应的子树内3
个不同节点的开销乘积的 最大值 ,并在节点i
处放置对应数目的金币。如果最大乘积是 负数 ,那么放置0
个金币。
请你返回一个长度为 n
的数组 coin
,coin[i]
是节点 i
处的金币数目。
示例 1:
输入:edges = [[0,1],[0,2],[0,3],[0,4],[0,5]], cost = [1,2,3,4,5,6] |
示例 2:
输入:edges = [[0,1],[0,2],[1,3],[1,4],[1,5],[2,6],[2,7],[2,8]], cost = [1,4,2,3,5,7,8,-4,2] |
示例 3:
输入:edges = [[0,1],[0,2]], cost = [1,2,-2] |
提示:
2 <= n <= 2 * 104
edges.length == n - 1
edges[i].length == 2
0 <= ai, bi < n
cost.length == n
1 <= |cost[i]| <= 104
edges
一定是一棵合法的树。
地址
https://leetcode.cn/contest/biweekly-contest-120/problems/find-polygon-with-the-largest-perimeter/
题意
数学问题 + 贪心
思路
1.
2. 复杂度分析:
- 时间复杂度:$O(n \log n)$,其中 $n$ 表示给定数组的长度。
- 空间复杂度:$O(n)$。
代码
class Solution: |
2972. 统计移除递增子数组的数目 II
给你一个下标从 0 开始的 正 整数数组 nums
。
如果 nums
的一个子数组满足:移除这个子数组后剩余元素 严格递增 ,那么我们称这个子数组为 移除递增 子数组。比方说,[5, 3, 4, 6, 7]
中的 [3, 4]
是一个移除递增子数组,因为移除该子数组后,[5, 3, 4, 6, 7]
变为 [5, 6, 7]
,是严格递增的。
请你返回 nums
中 移除递增 子数组的总数目。
注意 ,剩余元素为空的数组也视为是递增的。
子数组 指的是一个数组中一段连续的元素序列。
示例 1:
输入:nums = [1,2,3,4] |
示例 2:
输入:nums = [6,5,7,8] |
示例 3:
输入:nums = [8,7,6,6] |
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 109
地址
题意
贪心 + 数学
思路
- 题目比较有意思的题目,其实我们仔细分析一下,去掉一个数组中的一个连续子数组使得数组中剩余的元素严格递增,实际我们有三种去除方法:
- 去掉数组中的前 $x$ 个元素,使得剩余元素 $nums[{x+1}\cdots{n-1}]$ 严格递增;
- 去掉数组中的后 $x$ 个元素,使得剩余元素 $nums[{0}\cdots{n-x-1}]$ 严格递增;
- 去掉数组中间的 $x$ 个元素,使得剩余元素 $nums[{0}\cdots{i}],nums[{i+x+1}\cdots{n-1}]$ 严格递增;
根据以上分析,我们分别检测这三种情况: - 去掉前面的元素,此时我们求出数组后部最长的严格递增的元素数组为 $nums[r\cdots{n-1}]$,此时可以构成的严格递增子数组可以为:
$$
nums[r\cdots n-1] \
nums[r + 1\cdots n-1] \
nums[r + 2\cdots n-1] \
\cdots \
nums[n-1] \
$$
一共可以有 $n-r$ 个严格递增子数组; - 去掉后面的元素,此时我们求出数组前部最长的严格递增的元素数组为 $nums[0\cdots{l}]$,此时可以构成的严格递增子数组可以为:
$$
nums[0\cdots l] \
nums[0\cdots l-1] \
nums[0\cdots l-2] \
\cdots \
nums[0] \
$$
一共可以有 $l + 1$ 个严格递增子数组; - 去掉中间的元素,此时假设数组的前半分数数组为 $nums[0 \cdots l]$,后半部分数组为 $nums[r \cdots n-1]$,此时需要严格保证
- $nums[0 \cdots l]$ 严格递增;
- $nums[r \cdots n-1]$ 严格递增;
- $nums[r] > nums[l]$;
实际此时我们可以用双指针,$l$ 指向数组的前半部分结尾, $r$ 指向后半部分的开头,此时移动左侧 $l$ 后,看存在多少 $r$ 满足 $nums[r] > nums[l]$;
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 表示给定数组的长度。
- 空间复杂度:$O(1)$。
代码
class Solution: |
100123. 执行操作使频率分数最大
给你一个下标从 0 开始的整数数组 nums
和一个整数 k
。
你可以对数组执行 至多 k
次操作:
- 从数组中选择一个下标
i
,将nums[i]
增加 或者 减少1
。
最终数组的频率分数定义为数组中众数的 频率 。
请你返回你可以得到的 最大 频率分数。
众数指的是数组中出现次数最多的数。一个元素的频率指的是数组中这个元素的出现次数。
示例 1:
输入:nums = [1,2,6,4], k = 3 |
示例 2:
输入:nums = [1,4,4,2,4], k = 0 |
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 109
0 <= k <= 1014
地址
题意
树上dp
思路
- 题目首先是个比较简单的题目,不晓得为啥标记为难题,首先可以知道一点,子数中 $3$ 个不同节点的乘积的最大值可以以下两种情况构成:
- 值为整数的最大的 $3$ 个值相乘;
- 正数的最大值乘以负数最小的两个值相乘;
由于只有上述两种情况,因此我们每次遍历时返回当前节点为根的子树中的 $5$ 个节点的值: - 正数最大的三个值;
- 负数最大的两个值;
然后求得当前子树需要放置的金币数目。
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 表示树中节点的数目;
- 空间复杂度:$O(\log n)$,其中 $n$ 表示树中节点的数目;
代码
class Solution { |
欢迎关注和打赏,感谢支持!
扫描二维码,分享此文章