← 返回编程题库
coding-closer-stronger-bid-distance-bidirectional中等免费版2000ms未尝试

双向更强买价的最近距离:取前向 / 后向严格更高 print 中较近者

Closer-Stronger Bid Distance (Bidirectional): Min of Prev / Next Strictly-Higher Bid

开始编码

实现 solution(bids: list[int]) -> list[int]。给定一段长度为 N(1 <= N)的正整数买价 print 流 bids,对每个下标 i(0 <= i < N)定义:

  • prev_dist[i] = i - j_prev,其中 j_prev 是满足 bids[j] > bids[i] 的最大 j(j < i,严格更高的更早买价),若不存在则为 -1
  • next_dist[i] = j_next - i,其中 j_next 是满足 bids[j] > bids[i] 的最小 j(j > i,严格更高的更晚买价),若不存在则为 -1

返回 output,其中 output[i] = min(prev_dist[i], next_dist[i])(排除任何为 -1 的项);若两侧都是 -1(即 bids[i] 在两个方向都不存在严格更高的邻居——本质上 bids[i] 是全局最大,或与全局最大并列且两侧都没有严格更高的值),则 output[i] = -1

例:solution([4, 1, 2, 1, 5, 3]) 返回 [4, 1, 2, 1, -1, 1]。逐个 tick:

  • i=0(值 4):没有更早的 tick,prev_dist=-1;最近的更晚严格更强是下标 4 的 5,next_dist=4。输出 4(只有一侧存在)。
  • i=1(值 1):prev_dist=1(下标 0 的 4);next_dist=1(下标 2 的 2)。min(1, 1) = 1。
  • i=2(值 2):prev_dist=2(下标 0 的 4;下标 1 的 1 不算更强);next_dist=2(下标 4 的 5;下标 3 的 1 不算更强)。min(2, 2) = 2。
  • i=3(值 1):prev_dist=1(下标 2 的 2);next_dist=1(下标 4 的 5)。min(1, 1) = 1。
  • i=4(值 5):两个方向都不存在严格更高的买价(5 即全局最大)。prev_dist 与 next_dist 都是 -1,输出 -1。
  • i=5(值 3):prev_dist=1(下标 4 的 5);没有更晚的 tick,next_dist=-1。输出 1(只有一侧存在)。

需要明确的边界:N=1 返回 [-1](单元素两侧都没有邻居);严格递增输入如 [1, 2, 3, 4, 5] 返回 [1, 1, 1, 1, -1](除最后一个外每个 tick 的右邻居都严格更强;最后一个是全局最大);严格递减输入如 [5, 4, 3, 2, 1] 返回 [-1, 1, 1, 1, 1](除第一个外每个 tick 的左邻居都严格更强;第一个是全局最大);全等平台如 [3, 3, 3] 返回 [-1, -1, -1],因为 "stronger" 是严格的,整段 tape 都没有严格大于 3 的值;tape 上任何位置的全局唯一最大值都返回 -1

朴素方案对每个 i 双向线性回溯直到撞到严格更高的买价为止,最坏情况下退化为 O(N^2)(例如倒 V 形 tape 中心下标会把搜索推到两端边界)。标准做法是两遍单调递减栈:一遍从左往右得到 prev_dist,一遍从右往左得到 next_dist,每遍均摊 O(N)。严格大于的等价语义通过出栈条件 <= 来保证——栈顶等价 print 会被弹掉,所以答案会跨过所有等价 print,落在最近一次(或最近一次后续)严格更高的 print 上。最后用三分支 min 合并:两侧 -1 → -1;恰好一侧 -1 → 取另一侧;两侧都有 → 取 min。

实现细节由 stubs/stub.py 提供。

实践背景

某场内买价 tape 监控仪表盘把"双向最近一次严格更高买价的距离"用作 spike 隔离指标,用于区分"被两侧更强买价夹住的普通 tick"与"真正的局部最大值"。输出很小(例如 1)说明当前 tick 一步之遥就有严格更高的买价兜着,desk 把这种情况视作绕着更强参考价位的常规延续;输出很大说明该 tick 是一段有意义的局部最大——买方需要回溯或前瞻很远才能找到严格高于自己的 print。-1 哨兵标记当前窗口内的全局最大 tick,仪表盘据此把它标为可能"定义新阶段"的 print:两侧都不存在严格更高的买价。由于该指标跑在滚动 tape 段而非整段日内数据上,严格大于的等价语义可以让重复同价位的 print(场内常见微结构)不影响输出稳定性——若没有任何值严格压过局部最大,则平台上每个 tick 仍解析为 -1,而不会因为相邻等价 print 误返回 1。两遍单调栈是工程上的教科书选择,因为每个 tick 在每一侧最多入栈出栈各一次,即使在 bursty tape 段也能保证指标线程跟得上场内推送速率。

约束条件

  • 1 <= N <= 5000,其中 N 为 solution(bids) 的输入长度
  • 每个 bids[i] 为正整数,范围为 1 <= bids[i] <= 1000000
  • 输出为长度为 N 的 list[int];output[i] 为 min(prev_dist[i], next_dist[i])(排除 -1 项),若两侧均为 -1 则 output[i] = -1
  • Stronger 采用严格大于语义——两侧的等价 print 都不算更强
  • 输出按位置以整数精确比对(exact 比较)

样例

Case 1 · statement-example: bracketed local dips, global max in middle

输入: [[4,1,2,1,5,3]]

期望: [4,1,2,1,-1,1]

i=0 prev=-1 next=4 (idx 4 的 5) -> 4; i=1 prev=1 next=1 -> 1; i=2 prev=2 next=2 -> 2; i=3 prev=1 next=1 -> 1; i=4 (值 5) 即全局最大 -> -1; i=5 prev=1 next=-1 -> 1.

Case 2 · typical: peak in middle of seven ticks - both sides contribute

输入: [[2,4,6,8,6,4,2]]

期望: [1,1,1,-1,1,1,1]

极值 8 在下标 3 -> -1; 下标 0..2 prev=-1 next=1 -> 1; 下标 4..6 prev=1 next=-1 -> 1.

Case 3 · typical: V-shape - centre dip bracketed strictly

输入: [[5,3,1,3,5]]

期望: [-1,1,1,1,-1]

两个并列 5(下标 0 与 4)-> 都返回 -1(等价不算更强)。下标 1 prev=1 next=2 -> 1; 下标 2 prev=1 next=1 -> 1; 下标 3 prev=2 next=1 -> 1.

Case 4 · typical: strictly increasing - every tick except last sees right neighbour stronger

输入: [[1,2,3,4,5,6,7]]

期望: [1,1,1,1,1,1,-1]

每个 i<N-1 的 next=1; prev=-1(严格递增)。最后一个为全局最大 -> -1.

Case 5 · typical: strictly decreasing - every tick except first sees left neighbour stronger

输入: [[7,6,5,4,3,2,1]]

期望: [-1,1,1,1,1,1,1]

每个 i>0 的 prev=1; next=-1。第一个为全局最大 -> -1.

Case 6 · typical: only one side contributes for boundary ticks

输入: [[3,5,2,4,1]]

期望: [1,-1,1,2,1]

i=0 (3) prev=-1 next=1 (5) -> 1; i=1 (5) 全局最大 -> -1; i=2 (2) prev=1 (5) next=1 (4) -> 1; i=3 (4) prev=2 (5) next=-1 -> 2; i=4 (1) prev=1 (4) next=-1 -> 1.

Case 7 · typical: two equal peaks bracketing inner valley

输入: [[1,5,2,3,2,5,1]]

期望: [1,-1,1,2,1,-1,1]

两个并列 5(下标 1 与 5)-> 都返回 -1; tape 上没有严格大于 5 的值。中间 tick 被两个 5 夹住。

Case 8 · boundary: N=1 - singleton has no neighbours

输入: [[42]]

期望: [-1]

单元素 -> [-1].

Case 9 · boundary: N=2 ascending

输入: [[1,2]]

期望: [1,-1]

i=0 (1) prev=-1 next=1 -> 1; i=1 (2) 全局最大 -> -1.

Case 10 · boundary: N=2 descending

输入: [[2,1]]

期望: [-1,1]

i=0 (2) 全局最大 -> -1; i=1 (1) prev=1 -> 1.

Case 11 · boundary: N=2 equal - no strictly-stronger anywhere

输入: [[7,7]]

期望: [-1,-1]

两个等价 -> [-1, -1].

Case 12 · boundary: all-equal plateau N=10

输入: [[3,3,3,3,3,3,3,3,3,3]]

期望: [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]

全等平台 -> 全部 -1.

Case 13 · boundary: minimum-value tape (all 1)

输入: [[1,1,1,1,1,1]]

期望: [-1,-1,-1,-1,-1,-1]

全 1 -> 全部 -1.

Case 14 · boundary: maximum-value tick at front

输入: [[1000000,1,1,1,1,1]]

期望: [-1,1,2,3,4,5]

下标 0 -> -1; 下标 1..5 prev=i, next=-1, output[i]=i.

Case 15 · boundary: maximum-value tick at back

输入: [[1,1,1,1,1,1000000]]

期望: [5,4,3,2,1,-1]

下标 5 -> -1; 下标 0..4 prev=-1 next=5-i, output[i]=5-i.

Case 16 · boundary: two equal global maxes flanking valley

输入: [[6,1,2,1,6]]

期望: [-1,1,2,1,-1]

两个并列 6 -> 都返回 -1; 中间 tick 被夹住。

Case 17 · boundary: identical-prefix then larger value

输入: [[5,5,5,5,9]]

期望: [4,3,2,1,-1]

下标 4 (9) -> -1; 下标 0..3 prev=-1, next=4-i, output[i]=4-i.

Case 18 · adversarial: equal plateau interrupted by single spike

输入: [[5,5,5,8,5,5,5]]

期望: [3,2,1,-1,1,2,3]

下标 3 (8) -> -1; 下标 0..2 prev=-1 next=3-i; 下标 4..6 next=-1 prev=i-3.

Case 19 · adversarial: stepwise pairs ascending - strict pop matters

输入: [[2,2,4,4,6,6,8,8]]

期望: [2,1,2,1,2,1,-1,-1]

成对等价;严格更强语义跳过等价。末尾对 (8,8) -> 都返回 -1; 更早对向前看下一个严格更大值。

Case 20 · adversarial: ascending pyramid

输入: [[1,2,3,4,5,4,3,2,1]]

期望: [1,1,1,1,-1,1,1,1,1]

下标 4 (5) 全局最大 -> -1; 下标 0..3 prev=-1 next=4-i; 下标 5..8 next=-1 prev=i-4.

Case 21 · adversarial: many local maxes with equal global maxes at ends

输入: [[10,1,5,1,8,1,5,1,10]]

期望: [-1,1,2,1,4,1,2,1,-1]

两个并列 10 在两端 -> 都返回 -1; 下标 4 的 8 prev=4 next=4 -> 4. 中间 5 和 1 被夹住。

Case 22 · adversarial: alternating small-large pattern

输入: [[1,9,1,9,1,9,1]]

期望: [1,-1,1,-1,1,-1,1]

三个并列 9(下标 1,3,5)等价不算更强;tape 中没有严格大于 9 -> 三个 9 都返回 -1. 中间 1 被夹住。

Case 23 · adversarial: nearly-monotonic with one drop

输入: [[1,2,3,4,3,5,6,7]]

期望: [1,1,1,2,1,1,1,-1]

末尾 7 全局最大 -> -1; 测试中间下降的处理。

Case 24 · adversarial: prev-and-next-tie at exactly equal distance

输入: [[5,1,2,1,5]]

期望: [-1,1,2,1,-1]

下标 2 (2) prev_dist=2 next_dist=2 -> 2(并列 2)。

Case 25 · adversarial: equal global maxes at both ends, ascending interior

输入: [[8,1,2,3,4,5,6,7,8]]

期望: [-1,1,1,1,1,1,1,1,-1]

首尾两个 8 等价不算更强 -> 都返回 -1. 内部 tick prev=idx, next=N-1-idx, output=min(idx, N-1-idx).

Case 26 · adversarial: ascend-dip-ascend with equal local maxes

输入: [[1,2,3,4,5,4,5,4,3,2,1]]

期望: [1,1,1,1,-1,1,-1,1,1,1,1]

两个 5(下标 4 与 6)即全局最大 -> 都返回 -1; 下标 5 (4) prev=1 next=1 -> 1; 外侧 tick 各自被夹住。

Case 27 · adversarial: bowl shape with quad equal ends

输入: [[9,9,1,1,1,1,1,1,9,9]]

期望: [-1,-1,1,2,3,3,2,1,-1,-1]

四个并列 9(下标 0,1,8,9)-> 都返回 -1; 中间 1 被夹住。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · statement-example: bracketed local dips, global max in middle

输入: [[4,1,2,1,5,3]]

期望: [4,1,2,1,-1,1]

i=0 prev=-1 next=4 (idx 4 的 5) -> 4; i=1 prev=1 next=1 -> 1; i=2 prev=2 next=2 -> 2; i=3 prev=1 next=1 -> 1; i=4 (值 5) 即全局最大 -> -1; i=5 prev=1 next=-1 -> 1.

Case 2 · typical: peak in middle of seven ticks - both sides contribute

输入: [[2,4,6,8,6,4,2]]

期望: [1,1,1,-1,1,1,1]

极值 8 在下标 3 -> -1; 下标 0..2 prev=-1 next=1 -> 1; 下标 4..6 prev=1 next=-1 -> 1.

Case 3 · typical: V-shape - centre dip bracketed strictly

输入: [[5,3,1,3,5]]

期望: [-1,1,1,1,-1]

两个并列 5(下标 0 与 4)-> 都返回 -1(等价不算更强)。下标 1 prev=1 next=2 -> 1; 下标 2 prev=1 next=1 -> 1; 下标 3 prev=2 next=1 -> 1.

Case 4 · typical: strictly increasing - every tick except last sees right neighbour stronger

输入: [[1,2,3,4,5,6,7]]

期望: [1,1,1,1,1,1,-1]

每个 i<N-1 的 next=1; prev=-1(严格递增)。最后一个为全局最大 -> -1.

Case 5 · typical: strictly decreasing - every tick except first sees left neighbour stronger

输入: [[7,6,5,4,3,2,1]]

期望: [-1,1,1,1,1,1,1]

每个 i>0 的 prev=1; next=-1。第一个为全局最大 -> -1.

Case 6 · typical: only one side contributes for boundary ticks

输入: [[3,5,2,4,1]]

期望: [1,-1,1,2,1]

i=0 (3) prev=-1 next=1 (5) -> 1; i=1 (5) 全局最大 -> -1; i=2 (2) prev=1 (5) next=1 (4) -> 1; i=3 (4) prev=2 (5) next=-1 -> 2; i=4 (1) prev=1 (4) next=-1 -> 1.

Case 7 · typical: two equal peaks bracketing inner valley

输入: [[1,5,2,3,2,5,1]]

期望: [1,-1,1,2,1,-1,1]

两个并列 5(下标 1 与 5)-> 都返回 -1; tape 上没有严格大于 5 的值。中间 tick 被两个 5 夹住。

Case 8 · boundary: N=1 - singleton has no neighbours

输入: [[42]]

期望: [-1]

单元素 -> [-1].

Case 9 · boundary: N=2 ascending

输入: [[1,2]]

期望: [1,-1]

i=0 (1) prev=-1 next=1 -> 1; i=1 (2) 全局最大 -> -1.

Case 10 · boundary: N=2 descending

输入: [[2,1]]

期望: [-1,1]

i=0 (2) 全局最大 -> -1; i=1 (1) prev=1 -> 1.

Case 11 · boundary: N=2 equal - no strictly-stronger anywhere

输入: [[7,7]]

期望: [-1,-1]

两个等价 -> [-1, -1].

Case 12 · boundary: all-equal plateau N=10

输入: [[3,3,3,3,3,3,3,3,3,3]]

期望: [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]

全等平台 -> 全部 -1.

Case 13 · boundary: minimum-value tape (all 1)

输入: [[1,1,1,1,1,1]]

期望: [-1,-1,-1,-1,-1,-1]

全 1 -> 全部 -1.

Case 14 · boundary: maximum-value tick at front

输入: [[1000000,1,1,1,1,1]]

期望: [-1,1,2,3,4,5]

下标 0 -> -1; 下标 1..5 prev=i, next=-1, output[i]=i.

Case 15 · boundary: maximum-value tick at back

输入: [[1,1,1,1,1,1000000]]

期望: [5,4,3,2,1,-1]

下标 5 -> -1; 下标 0..4 prev=-1 next=5-i, output[i]=5-i.

Case 16 · boundary: two equal global maxes flanking valley

输入: [[6,1,2,1,6]]

期望: [-1,1,2,1,-1]

两个并列 6 -> 都返回 -1; 中间 tick 被夹住。

Case 17 · boundary: identical-prefix then larger value

输入: [[5,5,5,5,9]]

期望: [4,3,2,1,-1]

下标 4 (9) -> -1; 下标 0..3 prev=-1, next=4-i, output[i]=4-i.

Case 18 · adversarial: equal plateau interrupted by single spike

输入: [[5,5,5,8,5,5,5]]

期望: [3,2,1,-1,1,2,3]

下标 3 (8) -> -1; 下标 0..2 prev=-1 next=3-i; 下标 4..6 next=-1 prev=i-3.

Case 19 · adversarial: stepwise pairs ascending - strict pop matters

输入: [[2,2,4,4,6,6,8,8]]

期望: [2,1,2,1,2,1,-1,-1]

成对等价;严格更强语义跳过等价。末尾对 (8,8) -> 都返回 -1; 更早对向前看下一个严格更大值。

Case 20 · adversarial: ascending pyramid

输入: [[1,2,3,4,5,4,3,2,1]]

期望: [1,1,1,1,-1,1,1,1,1]

下标 4 (5) 全局最大 -> -1; 下标 0..3 prev=-1 next=4-i; 下标 5..8 next=-1 prev=i-4.

Case 21 · adversarial: many local maxes with equal global maxes at ends

输入: [[10,1,5,1,8,1,5,1,10]]

期望: [-1,1,2,1,4,1,2,1,-1]

两个并列 10 在两端 -> 都返回 -1; 下标 4 的 8 prev=4 next=4 -> 4. 中间 5 和 1 被夹住。

Case 22 · adversarial: alternating small-large pattern

输入: [[1,9,1,9,1,9,1]]

期望: [1,-1,1,-1,1,-1,1]

三个并列 9(下标 1,3,5)等价不算更强;tape 中没有严格大于 9 -> 三个 9 都返回 -1. 中间 1 被夹住。

Case 23 · adversarial: nearly-monotonic with one drop

输入: [[1,2,3,4,3,5,6,7]]

期望: [1,1,1,2,1,1,1,-1]

末尾 7 全局最大 -> -1; 测试中间下降的处理。

Case 24 · adversarial: prev-and-next-tie at exactly equal distance

输入: [[5,1,2,1,5]]

期望: [-1,1,2,1,-1]

下标 2 (2) prev_dist=2 next_dist=2 -> 2(并列 2)。

Case 25 · adversarial: equal global maxes at both ends, ascending interior

输入: [[8,1,2,3,4,5,6,7,8]]

期望: [-1,1,1,1,1,1,1,1,-1]

首尾两个 8 等价不算更强 -> 都返回 -1. 内部 tick prev=idx, next=N-1-idx, output=min(idx, N-1-idx).

Case 26 · adversarial: ascend-dip-ascend with equal local maxes

输入: [[1,2,3,4,5,4,5,4,3,2,1]]

期望: [1,1,1,1,-1,1,-1,1,1,1,1]

两个 5(下标 4 与 6)即全局最大 -> 都返回 -1; 下标 5 (4) prev=1 next=1 -> 1; 外侧 tick 各自被夹住。

Case 27 · adversarial: bowl shape with quad equal ends

输入: [[9,9,1,1,1,1,1,1,9,9]]

期望: [-1,-1,1,2,3,3,2,1,-1,-1]

四个并列 9(下标 0,1,8,9)-> 都返回 -1; 中间 1 被夹住。