type Solution struct { size int rects [][]int areas []int } func Constructor(rects [][]int) (sol Solution) { sol.size = len(rects) sol.areas = make([]int, sol.size+1) sol.rects = rects for i := 0; i < sol.size; i++ { r := rects[i] w, h := r[2]-r[0]+1, r[3]-r[1]+1 sol.areas[i+1] = sol.areas[i] + w*h } return } func (this *Solution) Pick() []int { idx := rand.Intn(this.areas[this.size]) beg, end := 1, this.size for beg <= end { mid := beg + (end-beg)/2 if this.areas[mid] < idx { beg = mid + 1 } else { end = mid - 1 } } if this.areas[beg] != idx { beg-- } pos := idx - this.areas[beg] r := this.rects[beg] w := r[2] - r[0] + 1 dx, dy := pos%w, pos/w return []int{r[0] + dx, r[1] + dy} } /** * Your Solution object will be instantiated and called as such: * obj := Constructor(rects); * param_1 := obj.Pick(); */