123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- import (
- "container/list"
- )
- func maxSlidingWindow(nums []int, k int) (ans []int) {
- n := len(nums)
- if n <= 1 || k == 1 {
- return nums
- }
- l := list.New()
- l.PushBack(0)
- for i := 1; i < n; i++ {
- if front := l.Front(); front.Value.(int) <= i-k {
- l.Remove(front)
- }
- for back := l.Back(); back != nil && nums[back.Value.(int)] <= nums[i]; back = l.Back() {
- l.Remove(back)
- }
- l.PushBack(i)
- if k-1 <= i {
- ans = append(ans, nums[l.Front().Value.(int)])
- }
- }
- return
- }
- func maxSlidingWindowSlow(nums []int, k int) (ans []int) { // If use BST, O(nlog(k))
- n := len(nums) // Actually, just abit slower.
- if n <= 1 || k == 1 {
- return nums
- }
- var sl SortedList
- for i := 0; i < n; i++ {
- if k <= i {
- ans = append(ans, sl.Max())
- sl.Delete(nums[i-k])
- }
- sl.Insert(nums[i])
- }
- return append(ans, sl.Max())
- }
- type SortedList struct {
- List []int
- Len int
- }
- func (sl SortedList) Max() int {
- return sl.List[sl.Len-1]
- }
- func (sl SortedList) Search(x int) int {
- beg, end := 0, sl.Len
- for beg < end {
- mid := beg + (end-beg)/2
- if x < sl.List[mid] {
- end = mid
- } else if sl.List[mid] < x {
- beg = mid+1
- } else {
- return mid
- }
- }
- return beg
- }
- func (sl *SortedList) Insert(x int) {
- idx := sl.Search(x)
- sl.List = append(sl.List, 0)
- copy(sl.List[idx+1:], sl.List[idx:])
- sl.List[idx] = x
- sl.Len++
- }
- func (sl *SortedList) Delete(x int) {
- idx := sl.Search(x)
- copy(sl.List[idx:], sl.List[idx+1:])
- sl.Len--
- sl.List = sl.List[:sl.Len]
- }
|