首頁>技術>

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.當雙端佇列裡沒值或者雙端佇列最右邊的值小於當前值,則把當前值的序號從右邊push到佇列裡。

2.否則pop最右邊的序號,直到符合條件為止。

3.雙端佇列左邊的序號太小,當前序號-左序號>=視窗大小W,需要pop左邊的序號。

4.雙端佇列最右邊的值就是最大值。

有程式碼。

程式碼用golang編寫,程式碼如下:

package mainimport (    "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程式碼](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class24/Code01_SlidingWindowMaxArray.java)

6
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Android基礎學習 day01