leetcode biweekly contest 82
双周赛的难度挺好,终于不是全部四题水题了,感觉质量挺高,虽然有难度,但是还是喜欢这类题目。
6116. 计算布尔二叉树的值
题目
给你一棵 完整二叉树 的根,这棵树有以下特征:
叶子节点 要么值为 0
要么值为 1
,其中 0
表示 False
,1
表示 True
。
非叶子节点 要么值为 2
要么值为 3
,其中 2
表示逻辑或 OR
,3
表示逻辑与 AND
。
计算 一个节点的值方式如下:
如果节点是个叶子节点,那么节点的 值 为它本身,即 True
或者 False
。
否则,计算 两个孩子的节点值,然后将该节点的运算符对两个孩子值进行 运算 。
返回根节点 root
的布尔运算值。
完整二叉树 是每个节点有 0
个或者 2
个孩子的二叉树。
叶子节点 是没有孩子的节点。
示例 1:
输入:root = [2,1,3,null,null,0,1] |
示例 2:
输入:root = [0] |
提示:
- 树中节点数目在
[1, 1000]
之间。 0 <= Node.val <= 3
- 每个节点的孩子数为
0
或2
。 - 叶子节点的值为
0
或1
。 - 非叶子节点的值为
2
或3
。
地址
https://leetcode.cn/problems/evaluate-boolean-binary-tree
题意
深度优先搜索
思路
- 直接按照深度有限搜索的方式进行遍历即可,每次在非叶子节点进行计算即可。
- 复杂度分析:
- 时间复杂度:$O(n))$, 其中 $n$ 为节点的数目。
- 空间复杂度:$O(1)$。
代码
class Solution { |
6117. 坐上公交的最晚时间
题目
给你一个下标从 0
开始长度为 n
的整数数组 buses
,其中 buses[i]
表示第 i
辆公交车的出发时间。同时给你一个下标从 0
开始长度为 m
的整数数组 passengers
,其中 passengers[j]
表示第 j
位乘客的到达时间。所有公交车出发的时间互不相同,所有乘客到达的时间也互不相同。
给你一个整数 capacity
,表示每辆公交车 最多 能容纳的乘客数目。
每位乘客都会搭乘下一辆有座位的公交车。如果你在 y
时刻到达,公交在 x
时刻出发,满足 y <= x
且公交没有满,那么你可以搭乘这一辆公交。最早 到达的乘客优先上车。
返回你可以搭乘公交车的最晚到达公交站时间。你 不能 跟别的乘客同时刻到达。
注意:数组 buses
和 passengers
不一定是有序的。
示例 1:
输入:buses = [10,20], passengers = [2,17,18,19], capacity = 2 |
示例 2:
输入:buses = [20,30,10], passengers = [19,13,26,4,25,11,21], capacity = 2 |
提示:
n == buses.length
m == passengers.length
1 <= n, m, capacity <= 105
2 <= buses[i], passengers[i] <= 109
buses
中的元素 互不相同 。passengers
中的元素 互不相同 。
地址
https://leetcode.cn/problems/the-latest-time-to-catch-a-bus
题意
数学问题
思路
- 这个题目类似于数学奥数,首先我们分析一下最后一个人可能的最晚上车时间。我们按照时间先后的顺序,和相应的 $capbility$ 可以很容易的求出每次班车的乘客。设最后一辆班车为 $i$, 可以载的乘客数量为 $m$ 个,此时可以有两种情况进行分析最后一个乘客的到达时间:
- 如果最后一辆班车 $i$ 的乘客数量 $m < capacity$,假如不考虑时间重复的问题,此时最后一个乘客可以在 $buses[i]$ 时间坐上班车,此时我们从 $time = buses[i]$ 开始检测,是否存在相同的时间,如果存在相同时间则将 $time$ 减 $1$, 知道不会出现重复时间为止。
- 如果最后一辆班车 $i$ 的乘客数量 $m = capacity$, 最后一个乘客的时间为 $last$,此时我们知道如果以 $last -1$ 时间达到时肯定可以上车,此时只需要沿着 $last - 1$ 找到第一个不重复的时间即可。
- 复杂度分析:
- 时间复杂度:$O(n\log n + m \log m)$,其中 $m,n$ 分别为两个数组的长度。
- 空间复杂度:$O(n)$,时间复杂度为 $O(n)$。
代码
class Solution { |
6118. 最小差值平方和
题目
给你两个下标从 0
开始的整数数组 nums1
和 nums2
,长度为 n
。
数组 nums1
和 nums2
的 差值平方和 定义为所有满足 0 <= i < n
的 (nums1[i] - nums2[i])2
之和。
同时给你两个正整数 k1
和 k2
。你可以将 nums1
中的任意元素 +1
或者 -1
至多 k1
次。类似的,你可以将 nums2
中的任意元素 +1
或者 -1
至多 k2
次。
请你返回修改数组 nums1
至多 k1
次且修改数组 nums2
至多 k2
次后的最小 差值平方和 。
注意:你可以将数组中的元素变成 负 整数。
示例 1:
输入:nums1 = [1,2,3,4], nums2 = [2,10,20,19], k1 = 0, k2 = 0 |
示例 2:
输入:nums1 = [1,4,10,12], nums2 = [5,8,6,9], k1 = 1, k2 = 1 |
提示:
n == nums1.length == nums2.length
1 <= n <= 105
0 <= nums1[i], nums2[i] <= 105
0 <= k1, k2 <= 109
地址
https://leetcode.cn/problems/minimum-sum-of-squared-difference
题意
数学+ 贪心算法
思路
- 题目本质为贪心算法,首先我们求出两个数组中每个索引上两个元素的差值绝对值为 $diff[i]$。对于 $k1,k2$ 不管用加还是减,我们都可以使得绝对值 $diff[i]$ 变小,假设目前还剩下 $1$ 个可以改变,对于 $x,y$, 此时如果满足 $x > y$, 此时我们应该将 $x$ 进行减 $1$, 因为我们可以知道如下不等式,$(x-1)^2 + y^2 < x ^ 2 + (y-1)^2$,因此我们应当的将 $diff$ 数组的元素最大值尽可能的小,此时我们将 $diff$ 中的最大值依次减小到跟第二大的值相等,按照上述步骤进行递减,直到 $k1 + k2$ 减到 $0$ 为止。
- 复杂度分析:
- 时间复杂度:$O(n \log n)$, $n$ 表示给定的数组的长度。
- 空间复杂度:$O(n)$,$n$ 表示给定数组的长度。
代码
class Solution { |
6119. 元素值大于变化阈值的子数组
题目
给你一个整数数组 nums
和一个整数 threshold
。
找到长度为 k
的 nums
子数组,满足数组中 每个 元素都 大于 threshold / k
。
请你返回满足要求的 任意 子数组的 大小 。如果没有这样的子数组,返回 -1
。
子数组 是数组中一段连续非空的元素序列。
示例 1:
输入:nums = [1,3,4,3,1], threshold = 6 |
示例 2:
输入:nums = [6,5,6,5,8], threshold = 7 |
提示:
1 <= nums.length <= 105
1 <= nums[i], threshold <= 109
地址
https://leetcode.cn/problems/subarray-with-elements-greater-than-varying-threshold
题意
单调栈
思路
- 我们直接求出结果的话比较难求出来,我们依次遍历第 $i$ 个元素,并找到以 $nums[i]$ 为最小的元素的最大长度,我们可以分开计算计算,计算 $i$ 的左边连续有多少个元素比 $nums[i]$ 小,记为 $left[i]$,计算 $i$ 的右边连续有多少个元素比 $nums[i]$ 小,记为 $right[i]$,此时我们知道以 $num[i]$ 为最小的连续子数组的长度为 $left[i] + right[i] + 1$,如果满足 $(left[i] + right[i] + 1) \times nums[i] > threshold$ 时,则就满足题目要求。
- 我们可以利用单调栈分别求出左右两边第一个小于 $nums[i]$ 的元素的索引 $j$。
- 复杂度分析:
- 时间复杂度:$n$,$n$ 表示数组的长度。
- 空间复杂度:$n$,$n$ 表示数组的长度。
代码
class Solution { |
欢迎关注和打赏,感谢支持!
- 关注我的博客: http://mikemeng.org/
- 关注我的知乎:https://www.zhihu.com/people/da-hua-niu
- 关注我的微信公众号: 公务程序猿
扫描二维码,分享此文章