2021-02-27:Wの固定サイズのウィンドウが順番にarrをスワイプされ、各スライドアウト条件の最大値が返されるとします。

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
}

実行結果は以下のとおりです。
ここに画像の説明を挿入


左の神のJavaコード
コメント

おすすめ

転載: blog.51cto.com/14891145/2641125