题目:
给你一个 n 个视频的上传序列,每个视频编号为 1 到 n 之间的 不同 数字,你需要依次将这些视频上传到服务器。请你实现一个数据结构,在上传的过程中计算 最长上传前缀 。
如果 闭区间 1 到 i 之间的视频全部都已经被上传到服务器,那么我们称 i 是上传前缀。最长上传前缀指的是符合定义的 i 中的 最大值 。
请你实现 LUPrefix 类:
LUPrefix(int n)初始化一个n个视频的流对象。void upload(int video)上传video到服务器。int longest()返回上述定义的 最长上传前缀 的长度。
算法:
方法一:树状数组
树状数组经常用于统计数量。适用于单点更新,区间查询场景。
type LUPrefix struct {
BIT []int
}
func Constructor(n int) LUPrefix {
return LUPrefix{make([]int, n + 1)}
}
func (this *LUPrefix) Upload(video int) {
this.add(video, 1)
}
func (this *LUPrefix) Longest() int {
left, right := 0, len(this.BIT) - 1
for left < right {
mid := (left + right + 1) / 2
if this.get(mid) != mid {
right = mid - 1
} else {
left = mid
}
}
return left
}
func (this *LUPrefix) get(i int) int {
ans := 0
for i > 0 {
ans = ans + this.BIT[i]
i = i - lowBit(i)
}
return ans
}
func lowBit(x int) int {
return x & (-x)
}
func (this *LUPrefix) add(i, v int) {
for i < len(this.BIT) {
this.BIT[i] = this.BIT[i] + v
i = i + lowBit(i)
}
}
/**
* Your LUPrefix object will be instantiated and called as such:
* obj := Constructor(n);
* obj.Upload(video);
* param_2 := obj.Longest();
*/