239.sliding-window-maximum.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import (
  2. "container/list"
  3. )
  4. func maxSlidingWindow(nums []int, k int) (ans []int) {
  5. n := len(nums)
  6. if n <= 1 || k == 1 {
  7. return nums
  8. }
  9. l := list.New()
  10. l.PushBack(0)
  11. for i := 1; i < n; i++ {
  12. if front := l.Front(); front.Value.(int) <= i-k {
  13. l.Remove(front)
  14. }
  15. for back := l.Back(); back != nil && nums[back.Value.(int)] <= nums[i]; back = l.Back() {
  16. l.Remove(back)
  17. }
  18. l.PushBack(i)
  19. if k-1 <= i {
  20. ans = append(ans, nums[l.Front().Value.(int)])
  21. }
  22. }
  23. return
  24. }
  25. func maxSlidingWindowSlow(nums []int, k int) (ans []int) { // If use BST, O(nlog(k))
  26. n := len(nums) // Actually, just abit slower.
  27. if n <= 1 || k == 1 {
  28. return nums
  29. }
  30. var sl SortedList
  31. for i := 0; i < n; i++ {
  32. if k <= i {
  33. ans = append(ans, sl.Max())
  34. sl.Delete(nums[i-k])
  35. }
  36. sl.Insert(nums[i])
  37. }
  38. return append(ans, sl.Max())
  39. }
  40. type SortedList struct {
  41. List []int
  42. Len int
  43. }
  44. func (sl SortedList) Max() int {
  45. return sl.List[sl.Len-1]
  46. }
  47. func (sl SortedList) Search(x int) int {
  48. beg, end := 0, sl.Len
  49. for beg < end {
  50. mid := beg + (end-beg)/2
  51. if x < sl.List[mid] {
  52. end = mid
  53. } else if sl.List[mid] < x {
  54. beg = mid+1
  55. } else {
  56. return mid
  57. }
  58. }
  59. return beg
  60. }
  61. func (sl *SortedList) Insert(x int) {
  62. idx := sl.Search(x)
  63. sl.List = append(sl.List, 0)
  64. copy(sl.List[idx+1:], sl.List[idx:])
  65. sl.List[idx] = x
  66. sl.Len++
  67. }
  68. func (sl *SortedList) Delete(x int) {
  69. idx := sl.Search(x)
  70. copy(sl.List[idx:], sl.List[idx+1:])
  71. sl.Len--
  72. sl.List = sl.List[:sl.Len]
  73. }