2021-02-28:整数配列arrと整数numが与えられました。特定の到着でサブアレイサブに到達したい場合

2021-02-28:整数配列arrと整数numが与えられました。arrのサブ配列subの場合、標準を満たす必要がある場合は、次の条件を満たす必要があります。subの最大値-sub <= numの最小値、標準を満たすarrのサブ配列の数を返します。

フーゲの答え2021-02-28:

シリアル番号を格納するために2つの両端キューが使用されます。maxWindowは大きいものから小さいものまで、minWindowは小さいものから大きいものまであります。
1.2つの両端キューが同時に右に展開されます。最大値と最小値が合計よりも大きい場合は、ループを終了します。
2.カウントします。
3.両端キューの左側にある期限切れのシリアル番号を削除します。
コードがあります。

コードはgolangで記述されており、コードは次のとおりです。

package main

import (
    "container/list"
    "fmt"
)

func main() {
    arr := []int{1, 2}
    sum := 6
    ret := num(arr, sum)
    fmt.Println(ret)

}

func num(arr []int, sum int) int {
    arrLen := len(arr)
    if arrLen == 0 || sum < 0 {
        return 0
    }
    count := 0
    maxWindow := list.New().Init()
    minWindow := list.New().Init()
    R := 0
    for L := 0; L < arrLen; L++ {
        for R < arrLen {
            //右扩
            for maxWindow.Len() > 0 && arr[maxWindow.Back().Value.(int)] <= arr[R] {
                maxWindow.Remove(maxWindow.Back())
            }
            maxWindow.PushBack(R)
            //右扩
            for minWindow.Len() > 0 && arr[minWindow.Back().Value.(int)] >= arr[R] {
                minWindow.Remove(minWindow.Back())
            }
            minWindow.PushBack(R)

            //如果最大值-最小值>sum,就不右扩了。
            if arr[maxWindow.Front().Value.(int)]-arr[minWindow.Front().Value.(int)] > sum {
                break
            } else {
                R++
            }

        }
        //计数
        count += R - L
        //删除过期窗口数据
        if maxWindow.Front().Value.(int) == L {
            maxWindow.Remove(maxWindow.Front())
        }
        if minWindow.Front().Value.(int) == L {
            minWindow.Remove(minWindow.Front())
        }
    }
    return count
}

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


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

おすすめ

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