497.random-point-in-non-overlapping-rectangles.go 865 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. type Solution struct {
  2. size int
  3. rects [][]int
  4. areas []int
  5. }
  6. func Constructor(rects [][]int) (sol Solution) {
  7. sol.size = len(rects)
  8. sol.areas = make([]int, sol.size+1)
  9. sol.rects = rects
  10. for i := 0; i < sol.size; i++ {
  11. r := rects[i]
  12. w, h := r[2]-r[0]+1, r[3]-r[1]+1
  13. sol.areas[i+1] = sol.areas[i] + w*h
  14. }
  15. return
  16. }
  17. func (this *Solution) Pick() []int {
  18. idx := rand.Intn(this.areas[this.size])
  19. beg, end := 1, this.size
  20. for beg <= end {
  21. mid := beg + (end-beg)/2
  22. if this.areas[mid] < idx {
  23. beg = mid + 1
  24. } else {
  25. end = mid - 1
  26. }
  27. }
  28. if this.areas[beg] != idx {
  29. beg--
  30. }
  31. pos := idx - this.areas[beg]
  32. r := this.rects[beg]
  33. w := r[2] - r[0] + 1
  34. dx, dy := pos%w, pos/w
  35. return []int{r[0] + dx, r[1] + dy}
  36. }
  37. /**
  38. * Your Solution object will be instantiated and called as such:
  39. * obj := Constructor(rects);
  40. * param_1 := obj.Pick();
  41. */