57.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package main
  2. /**
  3. * Definition for an interval.
  4. * type Interval struct {
  5. * Start int
  6. * End int
  7. * }
  8. */
  9. func insert(intervals []Interval, newInterval Interval) (in []Interval) {
  10. n := len(intervals)
  11. if n == 0 {
  12. return append(in, newInterval)
  13. }
  14. beg := search(intervals, 0, n-1, newInterval.Start)
  15. end := search(intervals, beg, n-1, newInterval.End)
  16. l, r := newInterval.Start, newInterval.End
  17. if beg > n-1 { // It's trival, but also very important
  18. in = intervals
  19. } else if l < intervals[beg].Start {
  20. in = append(in, intervals[:beg]...) // And, copy instead of reference
  21. } else if l > intervals[beg].End {
  22. in = append(in, intervals[:beg+1]...)
  23. } else {
  24. l = intervals[beg].Start
  25. in = append(in, intervals[:beg]...)
  26. }
  27. if end > n-1 {
  28. in = append(in, Interval{l, r})
  29. } else if r < intervals[end].Start {
  30. in = append(in, Interval{l, r})
  31. in = append(in, intervals[end:]...)
  32. } else if r > intervals[end].End {
  33. in = append(in, Interval{l, r})
  34. if end != n-1 {
  35. in = append(in, intervals[end+1:]...)
  36. }
  37. } else {
  38. r = intervals[end].End
  39. in = append(in, Interval{l, r})
  40. if end != n-1 {
  41. in = append(in, intervals[end+1:]...)
  42. }
  43. }
  44. return
  45. }
  46. func search(in []Interval, beg, end, val int) int { // Binary search in intervals
  47. for beg <= end {
  48. mid := (beg + end) / 2
  49. if val > in[mid].End {
  50. beg = mid + 1
  51. } else if val < in[mid].Start {
  52. end = mid - 1
  53. } else {
  54. return mid
  55. }
  56. }
  57. return beg
  58. }
  59. // func main() {
  60. // in := []Interval{{1, 2}, {3, 5}, {6, 7}, {8, 10}, {12, 16}}
  61. // ans := insert(in, Interval{4, 8})
  62. // fmt.Println(ans)
  63. // in = []Interval{{1, 5}}
  64. // ans = insert(in, Interval{6, 8})
  65. // fmt.Println(ans)
  66. // in = []Interval{}
  67. // ans = insert(in, Interval{2, 7})
  68. // fmt.Println(ans)
  69. // in = []Interval{{1, 5}}
  70. // ans = insert(in, Interval{0, 0})
  71. // fmt.Println(ans)
  72. // }