leetcode 第 308 场算法比赛

作者: | 更新日期:

拼手速的时间到了

本文首发于公众号:天空的代码世界,微信号:tiankonguse

零、背景

这次比赛题目都比较简单,又到拼手速的时候了。

这次比赛不少题还有多种思路,然后就会纠结使用哪种,犹豫就会败北。

一、和有限的最长子序列

题意:给一个数组,以及若干询问。
求子序列和不超过询问值的最大长度。

思路:子序列对数组元素的顺序无要求,答案肯定由最小的元素集合组成。
所以可以对数组排序,预处理出所有前缀和。

方法一:枚举。
对于每个询问,从前到后枚举前缀和,找到最后一个满足大小的长度。

方法二:二分查找。
对于每个询问,使用 upper_bound - 1 来代替二分查找即可。

二、从字符串中移除星号

题意:给一个含有星号的字符串。
每个星号字符可以消除左部相邻的非星号字符。
所有星号消除完字符后,求剩余的字符串。

思路:维护一个栈即可。

三、收集垃圾的最少总时间

题意:垃圾分为金属、纸和玻璃三个分类,给出 n 个垃圾堆三种垃圾个数,以及相邻垃圾堆之间的距离。
收集一个垃圾的代价是1,垃圾车行驶一单位距离的代价也是1。
三个垃圾车从 0 号垃圾堆触发,顺序去收集垃圾,问收集完所有垃圾的最小代价是多少?

思路:对于三个分类的垃圾个数,直接求和即可。
三个垃圾车的行驶距离肯定是该分类垃圾所在的最后一个垃圾堆。

所以找到每个分类垃圾最后出现的位置,求前缀距离和即可。

四、给定条件下构造矩阵

题意:n个互不相同的数字,放在 n*n 的矩阵中。
现在给出数字行之间的上下关系,以及列之间的左右关系。
求构造出符号关系的矩阵,不存在返回空。

思路:每行和每类互相独立,分别计算拓扑关系。

如果行和列拓扑关系不存在环,则存在答案。

确定拓扑关系后,行和列随意生成一组顺序。
每个数字在行和列中的位置,就是矩阵的下标。

五、最后

这次比赛很简单,最后一题给大家出一个扩展题:求满足关系的矩阵个数。

加油,算法人。

《完》

-EOF-

本文公众号:天空的代码世界
个人微信号:tiankonguse
公众号ID:tiankonguse-code

本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。

关注公众号,接收最新消息

tiankonguse +
穿越