LC_253场周赛_赛后总结

A 5838.检查字符串是否为数组前缀

问题描述:

给定字符串 s 和 字符串数组 word,请你检查 word 的前 k 个拼接字符串是否为 s。

解题:

  1. 先判断 word 头字符串的头个字符是否与 s 的头个字符相等,若不等则直接返回false。

  2. 用StringBuffer ans 拼接 word 的字符串,当 ans 的长度大于等于 s 的长度,不再拼接。

  3. 判断两者是否相等。

B 5839. 移除石子使总数最小

问题描述:

给定 n 堆石子piles 和 操作次数 k,每次操作:选出一堆石子(假设第 i 堆),移除 floor(piles[i] / 2)堆石子,floor 是向下取整。求移除 k 次的最小石子总数。

解题:

一开始我选择贪心算法,排序后从后往前减石子,但是由于石子堆的最大值可能会出现在当前下标之后,所以最终尝试了优先队列(大根堆),得以解决。

优先队列的简便声明:PriorityQueue pq = new PriorityQueue(((o1, o2) -> o2 - o1));

C 5840. 使字符串平衡的最小交换次数

问题描述:

字符串只有 '[' 和 ']'两种字符,求最小交换次数,使得字符串平衡。(只要左右匹配即平衡)

解题:

使用栈:

  1. 遇到 '['则进栈;

  2. 遇到 ']'则判断栈非空 且 栈顶是否为 '[',若都是则出栈;否之入栈']'。

  3. 记录最终栈中的'['个数为cnt,则答案为 (cnt + 1) / 2;

D(赛中未解出) 5841. 找出到每个位置为止最长的有效障碍赛跑路线

问题描述:

简单来说,找到每个下标的 LIS 的长度。

输入:obstacles = [1,2,3,2]
输出:[1,2,3,3]

解题:

题目所给数组长度为1e5,也就是说必须在 O(nlogn) 的时间复杂度下完成。

  1. 容易想到利用二分查找:把之前出现元素保存在一个数组中,然后对其进行二分查找,找到 upperBound(即小于等于当前元素的最大值)。

  2. 若找到,则为其最大长度 + 1;否之,为1。

反思:upperBound 没写好,赛中没能较好处理这一点,若处理好了,想必得以解决。

posted @ 2021-08-08 12:58  acchris  阅读(16)  评论(0)    收藏  举报