LC_253场周赛_赛后总结
A 5838.检查字符串是否为数组前缀
问题描述:
给定字符串 s 和 字符串数组 word,请你检查 word 的前 k 个拼接字符串是否为 s。
解题:
-
先判断 word 头字符串的头个字符是否与 s 的头个字符相等,若不等则直接返回false。
-
用StringBuffer ans 拼接 word 的字符串,当 ans 的长度大于等于 s 的长度,不再拼接。
-
判断两者是否相等。
B 5839. 移除石子使总数最小
问题描述:
给定 n 堆石子piles 和 操作次数 k,每次操作:选出一堆石子(假设第 i 堆),移除 floor(piles[i] / 2)堆石子,floor 是向下取整。求移除 k 次的最小石子总数。
解题:
一开始我选择贪心算法,排序后从后往前减石子,但是由于石子堆的最大值可能会出现在当前下标之后,所以最终尝试了优先队列(大根堆),得以解决。
优先队列的简便声明:PriorityQueue
C 5840. 使字符串平衡的最小交换次数
问题描述:
字符串只有 '[' 和 ']'两种字符,求最小交换次数,使得字符串平衡。(只要左右匹配即平衡)
解题:
使用栈:
-
遇到 '['则进栈;
-
遇到 ']'则判断栈非空 且 栈顶是否为 '[',若都是则出栈;否之入栈']'。
-
记录最终栈中的'['个数为cnt,则答案为 (cnt + 1) / 2;
D(赛中未解出) 5841. 找出到每个位置为止最长的有效障碍赛跑路线
问题描述:
简单来说,找到每个下标的 LIS 的长度。
输入:obstacles = [1,2,3,2]
输出:[1,2,3,3]
解题:
题目所给数组长度为1e5,也就是说必须在 O(nlogn) 的时间复杂度下完成。
-
容易想到利用二分查找:把之前出现元素保存在一个数组中,然后对其进行二分查找,找到 upperBound(即小于等于当前元素的最大值)。
-
若找到,则为其最大长度 + 1;否之,为1。
反思:upperBound 没写好,赛中没能较好处理这一点,若处理好了,想必得以解决。