Re: [取暖] 周赛

楼主: heterologic (仿生边缘人会梦见VTber吗)   2023-07-16 12:52:19
我来试着把我写题目的当下在想什么讲出来试试
因为这样字数会比较多 P币也会比较多
第一题:
看到 1-indexed 会觉得不太寻常,因为 LeetCode 的习惯是 0-indexed
接着看到 special 的定义是 n % i == 0 之后觉得合理,因为 i 不能是 0
然后剩下就是当 n % i == 0 时把 nums[i] 平方加起来
标准的第一题
第二题:
看到 operation, 先看他是不是无限次,这题是每个 index 最多一次
然后因为是问 subsequence, nums[i] 能变的值是
[nums[i] - k, nums[i] + k] 也只和自己本身的值有关
所以知道位置不重要,可以无脑 sort
(LeetCode 基本上不会出现 O(nlogn) 过不了但 O(n) 能过的题目)
sort 完之后会发现,答案一定是把 nums 的一段 subarray 都变成同一个值
不可能跳,因为假如 nums[i] 和 nums[j] 都变成 x
则 nums[i], ..., nums[j] 中间的所有人也都一定能变成 x (真的吗?)
所以假如考虑以 index 结尾的所有 subarray
我们只要找到第一个 nums[start] 且 他们两个可以变成同一个值就好
条件是 nums[index] - nums[start] <= 2k
因为 nums 递增,所以随着 index 增加,第一个合法的 start 也只会跟着增加
所以可以用 two-pointer
这题以第二题来说稍微偏难
第三题:
看到 dominant 的定义是 freq(x) * 2 > m
第一感想到的是“比其他加起来都多”(freq(x) > m - freq(x))
然后他要我们切成左右两边,两边都要有一样的 dominant
可以很简单的知道一定得是原本的 dominant
然后左右都是 dominant 代表和其他人的差距两边都必须 >= 1
也就是总共的差距 >= 2
如果总共的差距是 1 的话就会失败
接着在心理就出现“累计差距”的图
横轴是 index, 纵轴是考虑 nums[0, ..., index] 时 dominant 和其他人的差距
这个差距从 0 开始,如果遇到 dominant 就加一,否则减一
最后抵达 freq(x) - (m - freq(x))
因为我们知道 freq(x) - (m - freq(x)) >= 2
又每次一定只能 +-1, 所以一定有某一刻会通过“1”(真的吗?)
此时左半边的差距是 1, 右半边的差距 >= (2 - 1) > 0
所以就会合法
至于为什么会浮现这个图
因为 LeetCode 有类似的题目
第四题:
看到很多字串的 matching,
第一念头是该不会要写 Trie 吧好麻烦喔
不过接着看到长度 <= 10 且总数 <= 10^5
所以直接用 set 硬干也不会有什么问题
然后题目说要找最长又不包含禁字的 substring
想像中会是这样
<

Links booklink

Contact Us: admin [ a t ] ucptt.com