2021-02-27:Wの固定サイズのウィンドウが順番にarrをスワイプされ、各スライドアウト条件の最大値が返されるとします。たとえば、arr = [4,3,5,4,3,3,6,7]、W = 3です。戻り値:[5,5,5,4,6,7]。
フーゲの答え2021-02-27:
シリアル番号を格納するには、両端キューを使用します。配列をトラバースします。
1.両端キューに値がない場合、または両端キューの右端の値が現在の値よりも小さい場合は、現在の値のシーケンス番号を右からキューにプッシュします。
2.それ以外の場合は、条件が満たされるまで右端のシリアル番号をポップします。
3.両端キューの左側のシーケンス番号が小さすぎます。現在のシーケンス番号-左側のシーケンス番号> =ウィンドウサイズW、左側のシーケンス番号をポップする必要があります。
4.両端キューの右端の値が最大値です。
コードがあります。
コードはgolangで記述されており、コードは次のとおりです。
package main
import (
"container/list"
"fmt"
)
func main() {
arr := []int{4, 3, 5, 4, 3, 3, 6, 7}
w := 3
ret := getMaxWindow(arr, w)
fmt.Println(ret)
}
func getMaxWindow(arr []int, w int) []int {
arrLen := len(arr)
if arrLen < w || w < 1 {
return nil
}
qmax := list.New().Init()
res := make([]int, arrLen-w+1)
index := 0
for R := 0; R < arrLen; R++ {
for qmax.Len() > 0 && arr[qmax.Back().Value.(int)] <= arr[R] {
qmax.Remove(qmax.Back())
}
qmax.PushBack(R)
if qmax.Front().Value.(int) == R-w {
qmax.Remove(qmax.Front())
}
if R >= w-1 {
res[index] = arr[qmax.Front().Value.(int)]
index++
}
}
return res
}
実行結果は以下のとおりです。