436.find-right-interval.go 812 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. /**
  2. * Definition for an interval.
  3. * type Interval struct {
  4. * Start int
  5. * End int
  6. * }
  7. */
  8. func findRightInterval(intervals []Interval) []int {
  9. n := len(intervals)
  10. res, starts := make([]int, n), make([][]int, n)
  11. for i := 0; i < n; i++ {
  12. starts[i] = []int{intervals[i].Start, i}
  13. }
  14. sort.Sort(ints(starts))
  15. for i := 0; i < n; i++ {
  16. beg, end := 0, n-1
  17. for beg <= end {
  18. mid := beg + (end-beg)/2
  19. if starts[mid][0] < intervals[i].End {
  20. beg = mid + 1
  21. } else {
  22. end = mid - 1
  23. }
  24. }
  25. if beg == n {
  26. res[i] = -1
  27. } else {
  28. res[i] = starts[beg][1]
  29. }
  30. }
  31. return res
  32. }
  33. type ints [][]int
  34. func (is ints) Len() int { return len(is) }
  35. func (is ints) Less(i, j int) bool { return is[i][0] < is[j][0] }
  36. func (is ints) Swap(i, j int) { is[i], is[j] = is[j], is[i] }