480.sliding-window-median.go 1016 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. type ints []int
  2. func (is ints) search(x int) int {
  3. beg, end := 0, len(is)-1
  4. for beg <= end {
  5. mid := beg + (end-beg)/2
  6. if is[mid] < x {
  7. beg = mid + 1
  8. } else {
  9. end = mid - 1
  10. }
  11. }
  12. return beg
  13. }
  14. func (is *ints) insert(x int) {
  15. idx := is.search(x)
  16. if n := len(*is); idx == n {
  17. *is = append(*is, x)
  18. } else {
  19. nis := make([]int, n+1)
  20. copy(nis, (*is)[:idx])
  21. nis[idx] = x
  22. copy(nis[idx+1:], (*is)[idx:])
  23. *is = nis
  24. }
  25. }
  26. func (is *ints) delete(x int) {
  27. idx := is.search(x)
  28. if n := len(*is); idx == n-1 {
  29. *is = (*is)[:n-1]
  30. } else {
  31. copy((*is)[idx:], (*is)[idx+1:])
  32. *is = (*is)[:n-1]
  33. }
  34. }
  35. func medianSlidingWindow(nums []int, k int) (ans []float64) {
  36. n := len(nums)
  37. if n < k || k == 0 {
  38. return
  39. }
  40. var win ints = make([]int, 0)
  41. for i := 0; i < n; i++ {
  42. if k <= i {
  43. win.delete(nums[i-k])
  44. }
  45. win.insert(nums[i])
  46. if k-1 <= i {
  47. if k%2 == 1 {
  48. ans = append(ans, float64(win[k/2]))
  49. } else {
  50. ans = append(ans, float64(win[k/2-1]+win[k/2])/2.0)
  51. }
  52. }
  53. }
  54. return
  55. }