1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- /**
- * Definition for an inval.
- * type Interval struct {
- * Start int
- * End int
- * }
- */
- type SummaryRanges struct {
- is []Interval
- }
- /** Initialize your data structure here. */
- func Constructor() SummaryRanges {
- return SummaryRanges{}
- }
- func (this *SummaryRanges) AddNum(val int) {
- n := len(this.is)
- if n == 0 {
- this.is = []Interval{{val, val}}
- return
- }
- beg, end := 0, n-1
- for beg <= end {
- mid := beg + (end-beg)/2
- if in := this.is[mid]; in.Start <= val && val <= in.End {
- return
- } else if val < in.Start {
- end = mid - 1
- } else if in.End < val {
- beg = mid + 1
- }
- }
- if beg == n {
- if val == this.is[n-1].End+1 {
- this.is[n-1].End++
- } else {
- this.is = append(this.is, Interval{val, val})
- }
- } else if beg == 0 {
- if val == this.is[0].Start-1 {
- this.is[0].Start--
- } else {
- nis := make([]Interval, n+1)
- nis[0] = Interval{val, val}
- copy(nis[1:], this.is)
- this.is = nis
- }
- } else {
- if l, r := val == this.is[beg-1].End+1, val == this.is[beg].Start-1; l && r {
- this.is[beg].Start = this.is[beg-1].Start
- copy(this.is[beg-1:], this.is[beg:])
- this.is = this.is[:n-1]
- } else if l {
- this.is[beg-1].End++
- } else if r {
- this.is[beg].Start--
- } else {
- nis := make([]Interval, n+1)
- copy(nis, this.is[:beg])
- nis[beg] = Interval{val, val}
- copy(nis[beg+1:], this.is[beg:])
- this.is = nis // Since append([]T, []T...) is rather inefficient, copy is the best choice
- }
- }
- }
- func (this *SummaryRanges) GetIntervals() []Interval {
- return this.is
- }
- /**
- * Your SummaryRanges object will be instantiated and called as such:
- * obj := Constructor();
- * obj.AddNum(val);
- * param_2 := obj.GetIntervals();
- */
|