BISHI118 相差不超过k的最多数¶
中等通过率 30.81%python3样例通过牛客 AC双指针
一句话
选一个子集使 max-min <= k,求最大元素个数。
解题思路¶
这题考什么¶
「集合中任意两数之差 <= k」只和 max、min 有关,与选取顺序无关, 所以排序后答案一定是一段连续区间(排序后的下标区间)。 问题化为:排序后找最长的区间 [l, r] 满足 a[r] - a[l] <= k。
排序后 a 单调不减 => 固定 r 时,合法的最小 l 随 r 单调不减 => 双指针 O(n)。
数据规模与复杂度¶
n <= 2e5。排序 O(n log n)(Timsort,C 层),双指针 O(n)。 朴素枚举两端是 O(n^2) = 4e10,必挂。
坑在哪¶
- 必须先排序——不排序直接对原数组做滑动窗口是错的, 因为题目选的是子集不是子段;
- 相等元素要能全部选进来(用 <= 判断,不是 <);
- 「可以一个都不选」是干扰项:n >= 1 时单个元素总是合法,答案至少是 1;
- a_i、k 都到 1e9,C++ 里做差不会溢出但要小心,Python 无此问题。
参考实现¶
[:octicons-arrow-left-16: BISHI117](BISHI117.md) [BISHI119 :octicons-arrow-right-16:](BISHI119.md)