SWE / OA · OA Q2 (summary)

Capital One 数组分流 B/C:更大元素计数与三层平局规则

汇总帖给出按两组中大于当前值的元素数分流、组长与 B 优先平局;用坐标压缩与 Fenwick Tree 加速。

题目重点:汇总帖给出按两组中大于当前值的元素数分流、组长与 B 优先平局;用坐标压缩与 Fenwick Tree 加速。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 按 A 原顺序逐个分配,比较严格 >a;相等值不计。
  • 如果两组更大元素数相同,先选长度较短者;长度也相同选 B。
  • 初始 B、C 均空;输出两组保持各自插入顺序。

解题路线

  1. 朴素法对每个 a 扫描 B/C 统计 >a,按三层规则决定并追加;这直接实现题意,可作正确性 oracle。
  2. 优化时先离线坐标压缩输入值,为 B/C 各建一棵 Fenwick Tree;维护组长度与按值前缀频数。
  3. 对 a 查询 greaterB=lenB−countB(≤a),greaterC=lenC−countC(≤a);按 greater、长度、B 默认的优先序选择,随后在对应树的 a 位置加 1。
  4. 正确性来自 Fenwick 前缀和等于该组已有 ≤a 元素数,而更大个数正是组总长减它;每步选择与朴素定义一致。

手动走一遍

题目 [1,2,3,4,5]:1 时全平局进 B;2 时两组都无 >2,C 更短故进 C;3 时长度相同进 B;继续交替,得到 B=[1,3,5]、C=[2,4]。对于重复值 [2,2],两个 2 均不互相算‘更大’。

规模与取舍

朴素 O(n²) 时间;预压缩 O(n log n),每个元素两次前缀查询加一次更新 O(log n),总 O(n log n) 时间、O(n) 空间。

易错点与追问

容易失分的边界

  • 误用 ≥ 导致重复值计错。
  • 先按数值排序,破坏输入处理顺序。
  • 只按大于数量决定,漏掉组长和 B 默认平局。
  • Fenwick 查询 count(<a) 而非 count(≤a)。

继续深挖

  • 若需要在线流式输入,如何替代离线压缩?
  • 输入含负数和极大整数如何处理?
  • 若平局改成按组末尾元素比较如何改?
✓已复制微信号!