2021-02-27:假设一个固定大小为W的窗口,依次划过arr,返回每一次滑出状况的最大值。例如,arr = [4,3,5,4

举报
福大大架构师每日一题 发表于 2021/02/27 23:06:49 2021/02/27
【摘要】 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最右边的序号,直到符合条件为...

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编写,代码如下:

```go
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代码](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class24/Code01_SlidingWindowMaxArray.java)
[评论](https://user.qzone.qq.com/3182319461/blog/1614382674)

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。