package 滑动窗口
import "math"
/*
给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k个数字.滑动窗口每次只向右移动一位.返回滑动窗口中的最大值.
*/
func maxSlidingWindow(nums []int, k int) []int {
/*
滑动窗口中的最大值:
当滑动窗口移动时候,改变的元素只有窗口左边界的元素和窗口右边界的元素
假设被排除在外的左边界元素为left,被移入的左边界元素为right,上一个滑动窗口的最大值为maxRes
1. 如果 right>=maxRes:则maxRes=right,则继续移动
否则: if left==maxRes ,则说明left是上一个滑动窗口的最大值则重新计算窗口内的最大值
*/
maxRes:=math.MinInt
res:=make([]int,0)
for i:=0;i<len(nums)&&i<k;i++{
maxRes=max(maxRes,nums[i])
}
res=append(res,maxRes)
if len(nums)<k{
return res
} //如果数组的长度比滑动窗口的长度还要小
left,right:=0,k-1 //左闭右闭区间
for right+1<len(nums){
if nums[right+1]>=maxRes{
maxRes=nums[right+1]
}else{
if nums[left]==maxRes{
//则说明可能把最大值移除去了
tmpRes:=math.MinInt
for j:=left+1;j<=right+1;j++{//计算[left+1,right+1]中的值
tmpRes=max(tmpRes,nums[j])
}
maxRes=tmpRes
}
}
res=append(res,maxRes) //记录下一个滑动窗口的最大值
right++
left++
}
return res
}
//以上的方法超时了,那么可以优化的地方在于33步即如何设计一个数据结构使得当left最大值移除后还能记录下一个最大值
/*
那么就要用空间开销换取时间优化.
利用双端队列=>
双端队列中的下标值性质:从小到大排序且下标值对应的nums值是严格单调递减的
=>进一步表示双端队列中队头元素存放的是当前滑动窗口中的最大值.
举个例子:当双端队列中的队头元素为i,此时滑动窗口的左边界为left(left<i)=>则nums[left,i]之间的最大元素就是nums[i]
*/
func maxSlidingWindow2(nums []int, k int) []int {
/*
自定义一个push操作:
当加入的一个nums[i]>=nums[q[len(q)-1]]时要弹出队尾元素,知道队尾元素比nums[i]大或者队列长度为0时将nums[i]加入队尾
Step1:
初始化双端队列
Step2:
在实际移动滑动窗口前,需要先对队尾元素加入双端队列中,然后判断队头元素if q[0]==left时,表示当前滑动窗口的最大值被移除,那么下一个元素就是下一个滑动窗口的最大值
*/
q:=make([]int,0)
push:=func (i int){
//把元素加入队列q中
for len(q)>0&&nums[i]>=nums[q[len(q)-1]]{
q=q[:len(q)-1] //删除队尾元素
}
q=append(q,i)
}
//初始化双端队列
for i:=0;i<k;i++{
push(i)
}
res:=make([]int,0)
res=append(res,nums[q[0]])
left,right:=0,k-1//[left,right]
for right+1<len(nums){
//开始计算下一个滑动窗口的最大值
push(right+1)
if left==q[0]{
q=q[1:]
}
res=append(res,nums[q[0]])
right++
left++
}
return res
}
没有合适的资源?快使用搜索试试~ 我知道了~
后端技术栈_八股文_思维导图_面试
共185个文件
go:67个
png:56个
md:29个
需积分: 5 1 下载量 118 浏览量
2022-07-08
21:10:02
上传
评论
收藏 18.2MB RAR 举报
温馨提示
本资源主要是本人自己整理的后端技术栈相关的理论知识,供大家面试使用。 主要包含有:数据结构与算法,操作系统,数据库基本理论,计算机网络,Git,Linux,Makefile,分布式系统相关的基础理论(一致性算法、缓存、死锁和活锁、消息队列)。 以上基础理论主要以思维导图的形式存在,便于后端技术栈体系化以及便于记忆。 分布式系统中包含有ddia《数据密集型应用系统设计》的学习笔记
资源详情
资源评论
资源推荐
收起资源包目录
后端技术栈_八股文_思维导图_面试 (185个子文件)
计算机网络.emmx 3.68MB
数据结构与算法.emmx 2.14MB
Git.emmx 1.76MB
操作系统.emmx 1.54MB
后端技术栈.emmx 1.01MB
分布式系统.emmx 858KB
分布式系统基本理论.emmx 455KB
缓存.emmx 381KB
数据库基本理论.emmx 269KB
如何使服务器能够服务更多的用户(套接字编程).emmx 261KB
InnoDB存储引擎(primary).emmx 253KB
Raft.emmx 143KB
Nginx.emmx 134KB
消息队列.emmx 105KB
死锁和活锁.emmx 37KB
计算机网络.emmx 14KB
操作系统基础.emmx 13KB
分布式之唯一ID生成.emmx 13KB
InnoDB存储引擎之事务.emmx 11KB
复制系统.emmx 11KB
InnoDB存储引擎的表和日志结构.emmx 10KB
InnoDB锁机制.emmx 10KB
编译原理.emmx 10KB
MySQL体系结构.emmx 9KB
Redis基本操作和使用.emmx 9KB
分布式之一致性算法(强一致性、弱一致性和最终一致性).emmx 6KB
衡量Linux网络性能以及分析网络问题.emmx 5KB
MySQL索引使用和优化.emmx 5KB
.gitignore 184B
239.滑动窗口最大值.go 3KB
146.LRU缓存(Not Debug).go 3KB
143.重排链表.go 3KB
5.最长回文子串.go 3KB
236.二叉树的最近公共祖先.go 3KB
offer12.矩阵中的路径.go 2KB
84.柱形图中最大的矩形.go 2KB
438.异位词.go 2KB
300.最长递增子序列.go 2KB
300.最长递增子序列.go 2KB
2.两数相加.go 2KB
148.排序链表.go 2KB
912.排序数组.go 2KB
1Two Sum.go 2KB
121.买卖股票的最佳时机.go 2KB
offer13.机器人的运动范围.go 2KB
25.K个一组翻转链表.go 2KB
31.下一个排列.go 2KB
offer6.从尾到头打印链表.go 2KB
92.反转链表Ⅱ.go 2KB
3.最长无重复子串(模板).go 2KB
15.三数之和.go 1KB
141.环形链表.go 1KB
160.相交链表.go 1KB
Offer09.用两个栈实现队列.go 1KB
改124.二叉树中的最大路径和.go 1KB
33.搜索旋转排序数组.go 1KB
offer7.重建二叉树.go 1KB
42.接雨水.go 1KB
offer4.二维数组中的查找.go 1KB
718.最长重复子数组.go 1KB
20.有效括号.go 1KB
93.复原IP地址.go 1KB
82.删除排序链表中的重复元素Ⅱ.go 1KB
124.二叉树中的最大路径和.go 1KB
56.合并区间.go 1KB
54.螺旋矩阵.go 1KB
46.全排序.go 1KB
199.二叉树的右视图.go 1KB
567.字符串的排列.go 1KB
offer14.剪绳子.go 966B
103.二叉树的锯齿形层序遍历.go 960B
876.链表的中间节点.go 878B
88.合并两个有序数组.go 872B
53.最大子数组和.go 851B
718.最长重复子数组.go 849B
151.颠倒字符串中的单词.go 818B
415.字符串相加.go 813B
19.删除链表的倒数第N个结点.go 782B
Golang中对象排序方法.go 754B
Offer 22. 链表中倒数第k个节点.go 748B
200.岛屿数量.go 708B
206.反转链表.go 689B
102.二叉树的层次遍历.go 661B
142.环形链表Ⅱ.go 634B
offer11.旋转数组的最小数字.go 624B
14.最长公共前缀.go 618B
21.合并两个有序链表.go 610B
169.多数元素.go 596B
offer21.调整数组顺序使奇数位于偶数前面.go 547B
offer10.青蛙跳台阶问题.go 522B
215.数组中的第K个最大元素.go 496B
83.删除排序链表中的重复元素.go 480B
72.编辑距离.go 307B
22.括号生成.go 264B
offer3.数组中重复的数字.go 205B
main.go 13B
lc_process_go.iml 330B
InnoDB存储引擎之事务.md 15KB
数据结构与算法复习.md 14KB
Distributed_事务__并发控制(隔离性).md 12KB
共 185 条
- 1
- 2
Blockchain410
- 粉丝: 3095
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0