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]。java

福哥答案2021-02-27:git

採用雙端隊列,存序號。遍歷數組。
1.當雙端隊列裏沒值或者雙端隊列最右邊的值小於當前值,則把當前值的序號從右邊push到隊列裏。
2.不然pop最右邊的序號,直到符合條件爲止。
3.雙端隊列左邊的序號過小,當前序號-左序號>=窗口大小W,須要pop左邊的序號。
4.雙端隊列最右邊的值就是最大值。
有代碼。github

代碼用golang編寫,代碼以下: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代碼
評論ide

相關文章
相關標籤/搜索