leetcode biweekly contest 95
最近双周赛的题目质量明显高很多,里面非常多非常有意思的题目,非常值得学习与思考。本次双周赛的题目质量非常高,非常值得学习的题目。
2525. 根据规则将箱子分类
给你四个整数 length
,width
,height
和 mass
,分别表示一个箱子的三个维度和质量,请你返回一个表示箱子 类别 的字符串。
如果满足以下条件,那么箱子是
"Bulky"
的:
- 箱子 至少有一个 维度大于等于
104
。 - 或者箱子的 体积 大于等于
109
。
- 箱子 至少有一个 维度大于等于
如果箱子的质量大于等于
100
,那么箱子是"Heavy"
的。如果箱子同时是
"Bulky"
和"Heavy"
,那么返回类别为"Both"
。如果箱子既不是
"Bulky"
,也不是"Heavy"
,那么返回类别为"Neither"
。如果箱子是
"Bulky"
但不是"Heavy"
,那么返回类别为"Bulky"
。如果箱子是
"Heavy"
但不是"Bulky"
,那么返回类别为"Heavy"
。
注意,箱子的体积等于箱子的长度、宽度和高度的乘积。
示例 1:
输入:length = 1000, width = 35, height = 700, mass = 300 |
示例 2:
输入:length = 200, width = 50, height = 800, mass = 50 |
提示:
1 <= length, width, height <= 105
1 <= mass <= 103
地址
https://leetcode.cn/problems/categorize-box-according-to-criteria/description/
题意
直接遍历
思路
1.我们直接判断每个箱子满足几个条件,然后按照题目要求进行分类即可。
2. 复杂度分析:
- 时间复杂度:$O(1)$。
- 空间复杂度:$O(1)$。
代码
class Solution { |
2526. 找到数据流中的连续整数
给你一个整数数据流,请你实现一个数据结构,检查数据流中最后 k
个整数是否 等于 给定值 value
。
请你实现 DataStream 类:
DataStream(int value, int k)
用两个整数value
和k
初始化一个空的整数数据流。boolean consec(int num)
将num
添加到整数数据流。如果后k
个整数都等于value
,返回true
,否则返回false
。如果少于k
个整数,条件不满足,所以也返回false
。
示例 1:
输入: |
提示:
1 <= value, num <= 109
1 <= k <= 105
- 至多调用
consec
次数为105
次。
地址
https://leetcode.cn/problems/find-consecutive-integers-from-a-data-stream/
题意
栈
思路
- 保存栈顶元素 $x$ 的个数为 $freq[x]$,则此时加入新的元素 $num$ 时:
- 如果 $num = x$,则此时栈顶的元素仍然为 $x$,且栈顶元素的个数为 $freq[x] + 1$;
- 如果 $num \neq x$,则此时栈顶的元素为 $num$,且栈顶元素的个数为 $freq[num] = 1$;
我们检测栈顶的元素是否为 $value$,且栈顶的元素个数是否大于等于 $k$ 即可。
- 复杂度分析:
- 时间复杂度:$O(1)$,其中 $\text{consec}$ 的时间复杂度为 $O(1)$。
- 空间复杂度:$O(n)$,其中 $n$ 为插入元素的次数。
代码
- 二分查找
class DataStream {
public:
DataStream(int value, int k) {
this->value = value;
this->k = k;
arr.emplace_back(-1, 0);
}
bool consec(int num) {
if (num == arr.back().first) {
arr.back().second++;
} else {
arr.emplace_back(num, 1);
}
if (arr.back().first == value && arr.back().second >= k) {
return true;
} else {
return false;
}
}
private:
vector<pair<int, int>> arr;
int value, k;
};
2527. 查询数组 Xor 美丽值
给你一个下标从 0 开始的整数数组 nums
。
三个下标 i
,j
和 k
的 有效值 定义为 ((nums[i] | nums[j]) & nums[k])
。
一个数组的 xor 美丽值 是数组中所有满足 0 <= i, j, k < n
的三元组 (i, j, k)
的 有效值 的异或结果。
请你返回 nums
的 xor 美丽值。
注意:
val1 | val2
是val1
和val2
的按位或。val1 & val2
是val1
和val2
的按位与。
示例 1:
输入:nums = [1,4] |
示例 2:
输入:nums = [15,45,20,2,34,35,5,44,32,30] |
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 109
地址
题意
数学思路
思路
- 比赛的时候直接盲猜的答案,结果果真猜对了。题目看起来复杂的,实际解法都会非常的巧妙。但是实际的解法非常好的思考角度,根据题目给定的组合公式 $((nums[i] | nums[j]) \And nums[k])$,可以有如下结论:
- 如果 $i = j = k$,此时上述组合公式的结果一定为 $\textit{nums[i]}$;
- 如果 $i \neq j$,则此时或运算满足交换定理,则此时我们知道如果存在 $x = ((nums[i] | nums[j]) \And nums[k])$,则此时一定存在 $y = ((nums[j] | nums[i]) \And nums[k])$,此时我们知道 $x = y$,此时 $x \oplus y = 0$,因此最终的结果一定可以省略掉 $i \neq j$ 的项;
- 如果 $i = j, i \neq k$,此时上述等式即等于 $((nums[i] | nums[j]) \And nums[k]) = nums[i] \And nums[k]$,则此时与运算满足交换定理,则此时我们知道如果存在 $x = nums[i] \And nums[k]$,则此时一定存在 $y = nums[k]
\And nums[i]$,此时我们知道 $x = y$,此时 $x \oplus y = 0$,因此最终的结果一定可以省略掉 $i = j, i \neq k$ 的项; - 最终我们知道只剩下 $i = j = k$ 的项。
- 还有另外一种数学解法解释的也非常详细,非常值得思考的题目,本次双周赛的题目质量非常高。
- 复杂度分析
- 时间复杂度:时间复杂度为 $O(n)$,$n$ 表示数组的长度。
- 空间复杂度:时间复杂度为 $O(1)$。
代码
class Solution { |
2528. 最大化城市的最小供电站数目
给你一个下标从 0 开始长度为 n
的整数数组 stations
,其中 stations[i]
表示第 i
座城市的供电站数目。
每个供电站可以在一定 范围 内给所有城市提供电力。换句话说,如果给定的范围是 r
,在城市 i
处的供电站可以给所有满足 |i - j| <= r
且 0 <= i, j <= n - 1
的城市 j
供电。
|x|
表示x
的 绝对值 。比方说,|7 - 5| = 2
,|3 - 10| = 7
。
一座城市的 电量 是所有能给它供电的供电站数目。
政府批准了可以额外建造 k
座供电站,你需要决定这些供电站分别应该建在哪里,这些供电站与已经存在的供电站有相同的供电范围。
给你两个整数 r
和 k
,如果以最优策略建造额外的发电站,返回所有城市中,最小供电站数目的最大值是多少。
这 k
座供电站可以建在多个城市。
示例 1:
输入:stations = [1,2,4,5,0], r = 1, k = 2 |
示例 2:
输入:stations = [4,4,4,4], r = 0, k = 3 |
提示:
n == stations.length
1 <= n <= 105
0 <= stations[i] <= 105
0 <= r <= n - 1
0 <= k <= 109
地址
https://leetcode.cn/problems/maximize-the-minimum-powered-city/
题意
二分查找 + 差分数组
思路
- 根据题目给定的数量级即可知道本题一定要用到二分查找,但是存在一定的技巧。我们二分查边枚举可能的最小供电站的最大数目 $val$,每次检测如下:
- 我们首先使用差分数组每半径范围的的数组进行处理,这样即可线性时间求出每个城市的供电站的数目;
- 我们从左向右或者从右向左依次检测每个城市的供电站的数目,如果当前第 $i$ 个城市的变电站的数目为 $cnt$,且少于 $val$,即 $cnt < val$,此时我们需要从 $k$ 中取出 $val - cnt$ 个电站,此时根据左右策略,我们应该将电站建在最右边,即 $i + r$ 处,此时增加的 $val - cnt$ 个电站覆盖的范围为 $[i, i + 2r]$,此时我们需要在差分数组中进行相应的改变,即在 $i + 2r + 1$ 处减去 $val - cnt$。
- 感觉还算是非常好的面试题目,有一定的技巧性。
- 复杂度分析:
- 时间复杂度:$O(n \log C)$,其中 $n$ 表示数组的长度。
- 空间复杂度:$O(n)$,其中 $n$ 表示数组的长度。
代码
class Solution { |
欢迎关注和打赏,感谢支持!
- 关注我的博客: http://whistle-wind.com/
- 关注我的知乎:https://www.zhihu.com/people/da-hua-niu
- 关注我的微信公众号: 公务程序猿
扫描二维码,分享此文章