1 条题解
-
0
题目理解
我们有一个非递减排序的数组 。
我们可以移除任意元素(包括不移除),然后按照规则将剩余元素分配到不同的数组中:- 第一个元素 总是开始一个新的数组;
- 对于 ,如果 ,那么 开始一个新数组;否则, 加入 所在的数组。
目标:通过移除一些元素,使最终得到的数组个数最大。
关键观察
-
第一个元素必须保留
如果去掉 ,那么新的第一个元素 ()的值只会更大或相等,不会让答案变好。保留 可以尽早开始计数。 -
跳跃规则
规则本质是:
若当前元素 与上一个保留的元素 满足:
[ x - last > 1 ]
则 会开始一个新的数组。否则,它加入前一个数组。 -
贪心策略
我们希望在保留元素的过程中,尽可能多地触发“”的条件。
因此,一旦某个元素与上一个保留元素的差大于 1,我们就保留它,并让它开始一个新数组。
如果差 ,我们可以选择跳过它,因为跳过它不会破坏后面的可能性,甚至可能让后面的元素更容易满足条件(例如跳过 可以让 相对上一个保留元素形成更大的差)。 -
为什么跳过更小的差不会变差
假设上一个保留元素是 ,当前元素是 。- 如果保留它,它会加入 所在的数组,不增加数组数,且下一个可能元素是 ,差为 1,仍不满足 。
- 如果跳过它,下一个元素 ,与 的差 ,会触发新数组。
因此跳过不会让答案变小。
算法步骤
- 初始化 (因为 ,所以 可以确保第一个元素一定满足条件)。
- 初始化 。
- 遍历数组 的每个元素 :
- 如果 :
- 增加 (表示 开始一个新数组)
- 更新
- 否则():
- 跳过 (不更新 ,也不增加 )
- 如果 :
- 输出 。
示例验证
示例 1
- : →
- : → 跳过
- : →
- : → 跳过
- : →
- : → 跳过
输出 ,与题目一致。
示例 3
- :
- : → 跳过
- : → 跳过
- : →
输出 ,正确。
示例 5
- :
- : →
- : →
输出 ,正确。
复杂度分析
- 每个元素只处理一次, 时间。
- 仅使用常数个变量, 额外空间。
- 总 不超过 ,可轻松通过。
总结
题目的贪心策略是:
只要当前元素与上一个保留元素的差值大于 1,就保留它并增加数组计数;否则跳过它。
这样可以在保留第一个元素的基础上,最大化“新数组”的触发次数。
- 1
信息
- ID
- 6587
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者