解题思路
本题要求每次 query target 时,统计以当前最新到达的流水为右端点,且区间和等于 target 的连续区间个数。
使用 前缀和 + 哈希表。
设当前所有已添加数据的前缀和为 sum。
如果某个区间 [l, r] 的和为 target,且 r 是当前最新元素,那么:
P14391.统计盈利目标区间(100分)
题目内容
某公司的财务流水系统重构为实时流处理架构。日盈利数据(可正可负)作为消息一条条实时推送。
请设计一个实时监控模块,它接收两个序列:操作指令序列 ops 和对应的参数序列 vals。
- 当 ops[i] == "add" 时:代表接收一条新的日盈利流数据,其值为 vals[i]。
- 当 ops[i] == "query" 时:代表发起一次实时查询,目标值为 vals[i](即 target)。要求立刻返回:以当前最新到达的这笔流水为区间右端点,且区间总和恰好等于 target 的连续区间个数。
输入描述
ops:字符串数组,表示操作指令序列。
vals:整型数组,表示与 ops 一一对应的参数序列。对于 add 指令,代表盈利值;对于 query 指令,代表目标值 target。
输出描述
返回一个整型数组,按照 query 指令出现的顺序,依次保存每次查询的结果,如果没有 query ,返回空数组,如果 query 没有符合条件的区间,返回 0 。
约束条件
-
ops 中仅包含" add "和" query ", ops.length<=105
-
−104<=values[i]<=104当操作作为add$
-
−109<=values[i]<=109 当操作作为 query
-
用例的输入都是合法的
样例1
输入
["add","add","query","add","query"],[1,2,3,3,6]
输出
[1,1]
说明
- add 1:流为 [1]
- add 2:流为 [1,2]
- query 3:最新数据是 2。以 2 结尾且和为 3 的区间只有 [1,2],返回 1。
- add 3:流为 [1,2,3]
- query 6:最新数据是 3。以 3 结尾且和为 6 的区间只有 [1,2,3],返回 1。
样例2
输入
["add","add","add","query","add","add","query"],[1,-1,0,0,1,-1,0]
输出
[2,3]
说明
- 前三次 add 后,流为 [1,−1,0]。
- 第一个 query 0:以最新元素 0 结尾,和为 0 的区间有 [0] 和 [1,−1,0],返回 2 。
- 后两次 add 后,流为 [1,−1,0,1,−1]。
- 第二个 query 0:以最新元素 −1 结尾,和为 0 的区间有 [1,−1]、[0,1,−1]、[1,−1,0,1,−1],返回 3。