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代码
评论

©著作权归作者所有:来自51CTO博客作者福大大的原创作品,如需转载,请注明出处,否则将追究法律责任

好知识,才能预见未来

赞赏

0人进行了赞赏支持

更多相关文章

  1. 数据结构与算法专题——第二题 优先队列
  2. 数据结构与算法专题——第九题 外排序
  3. 怎么给女朋友讲明白线程池?
  4. 数据结构与算法—队列(搞懂最常用数据结构之一)
  5. 字节尿性,康托展开求第K个排列!
  6. RabbitMQ 基础概念进阶
  7. Java 队列同步器框架 AQS 实现原理
  8. RabbitMQ 入门之基础概念
  9. 一篇文章搞懂Handler发消息时,Handler,MessageQueue,Looper都做了些

随机推荐

  1. React VS Vue:2020年应该选哪个?[每日前端
  2. 每日学习-ansible replace模块
  3. MYSQL常用命令(3)
  4. 为什么我喜欢 JavaScript 可选链[每日前
  5. Java内存模型-本机内存
  6. 为什么要使用 package-lock.json[每日前
  7. MYSQL常用命令(4)
  8. SQL 内连接,左外连接,右外连接,全连接
  9. 用map代替纯JavaScript对象[每日前端夜话
  10. 数据库数据完整性