1 回答
TA贡献2065条经验 获得超14个赞
这是执行此操作的算法的草图:
数据结构将是:
type Boundary struct {
Time time.Time
AddRemove int
Value int
}
ABoundary将表示Value在给定时间从值列表中添加或删除的值。对于一个范围:
[from,to]=number
您创建两个Boundary对象:
b1:=Boundary{Time:from,AddRemove: 1, Value: number}
b2:=Boundary{Time:to,AddRemove:-1,Value:number}
然后,您可以按时间和 对所有边界对象进行排序AddRemove。如果时间相等,您应该先处理添加,然后再删除。完成此操作后,您可以处理边界对象并创建范围:
last:=time.Time{}
values:=map[int]struct{}{}
for _,b:=range boundaries {
if last.IsZero() {
last=b.Time
values[b.Value]=struct{}{}
} else {
// Create a new range here with [last,b.Time] with values given in `values`
if b.AddRemove==1 {
values[b.Value]=struct{}{}
} else {
delete(values,b.Value)
}
last=b.Time
}
}
- 1 回答
- 0 关注
- 154 浏览
添加回答
举报