1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- type ints []int
- func (is ints) search(x int) int {
- beg, end := 0, len(is)-1
- for beg <= end {
- mid := beg + (end-beg)/2
- if is[mid] < x {
- beg = mid + 1
- } else {
- end = mid - 1
- }
- }
- return beg
- }
- func (is *ints) insert(x int) {
- idx := is.search(x)
- if n := len(*is); idx == n {
- *is = append(*is, x)
- } else {
- nis := make([]int, n+1)
- copy(nis, (*is)[:idx])
- nis[idx] = x
- copy(nis[idx+1:], (*is)[idx:])
- *is = nis
- }
- }
- func (is *ints) delete(x int) {
- idx := is.search(x)
- if n := len(*is); idx == n-1 {
- *is = (*is)[:n-1]
- } else {
- copy((*is)[idx:], (*is)[idx+1:])
- *is = (*is)[:n-1]
- }
- }
- func medianSlidingWindow(nums []int, k int) (ans []float64) {
- n := len(nums)
- if n < k || k == 0 {
- return
- }
- var win ints = make([]int, 0)
- for i := 0; i < n; i++ {
- if k <= i {
- win.delete(nums[i-k])
- }
- win.insert(nums[i])
- if k-1 <= i {
- if k%2 == 1 {
- ans = append(ans, float64(win[k/2]))
- } else {
- ans = append(ans, float64(win[k/2-1]+win[k/2])/2.0)
- }
- }
- }
- return
- }
|