package main
import "fmt"
type DuQueue struct {
Q []int
}
func main() {
nums := []int{4, 3, -1, -3, 5, 3}
k := 3
winQ := &DuQueue{}
ans := []int{}
winQ.Q = make([]int, 0)
if len(nums) <= k {
for _, item := range nums {
winQ.RPush(item)
}
max := winQ.GetFirstE()
ans = append(ans, max)
} else {
for i, item := range nums {
if i < k-1 {
winQ.RPush(item)
continue
}
winQ.RPush(item)
max := winQ.GetFirstE()
ans = append(ans, max)
winQ.LPop(nums[i-(k-1)])
}
}
fmt.Println(ans)
}
func (d *DuQueue) RPush(newElement int) {
if len(d.Q) == 0 {
d.Q = append(d.Q, newElement)
return
}
for {
last := d.GetLastE()
if last < newElement {
if len(d.Q) > 0 {
d.RPop()
} else {
d.Q = append(d.Q, newElement)
break
}
} else {
d.Q = append(d.Q, newElement)
break
}
}
}
func (d *DuQueue) RPop() {
if len(d.Q) == 0 {
return
}
d.Q = d.Q[:len(d.Q)-1]
}
func (d *DuQueue) GetLastE() int {
if len(d.Q) > 0 {
return d.Q[len(d.Q)-1:][0]
}
return 0
}
func (d *DuQueue) GetFirstE() int {
if len(d.Q) > 0 {
return d.Q[0]
}
return 0
}
func (d *DuQueue) LPop(val int) {
if len(d.Q) == 0 {
return
}
first := d.GetFirstE()
if first == val {
d.Q = d.Q[1:]
}
}