| 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]}
 |