2424. 最长上传前缀

91 阅读1分钟

题目:
给你一个 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();
 */