2021-02-28:给定一个整型数组arr,和一个整数num。某个arr中的子数组sub,如果想达标,必须满足:sub中最大值
【摘要】 2021-02-28:给定一个整型数组arr,和一个整数num。某个arr中的子数组sub,如果想达标,必须满足:sub中最大值 – sub中最小值 <= num,返回arr中达标子数组的数量。福哥答案2021-02-28:采用两个双端队列,存序号。maxWindow从大到小,minWindow从小到大。1.两个双端队列同时右扩。当最大值-最小值大于sum,退出循环。2.计数。3.删除双端队...
2021-02-28:给定一个整型数组arr,和一个整数num。某个arr中的子数组sub,如果想达标,必须满足:sub中最大值 – sub中最小值 <= num,返回arr中达标子数组的数量。
福哥答案2021-02-28:
采用两个双端队列,存序号。maxWindow从大到小,minWindow从小到大。
1.两个双端队列同时右扩。当最大值-最小值大于sum,退出循环。
2.计数。
3.删除双端队列左边的过期序号。
有代码。
代码用golang编写,代码如下:
```go
package main
import (
"container/list"
"fmt"
)
func main() {
arr := []int{1, 2}
sum := 6
ret := num(arr, sum)
fmt.Println(ret)
}
func num(arr []int, sum int) int {
arrLen := len(arr)
if arrLen == 0 || sum < 0 {
return 0
}
count := 0
maxWindow := list.New().Init()
minWindow := list.New().Init()
R := 0
for L := 0; L < arrLen; L++ {
for R < arrLen {
//右扩
for maxWindow.Len() > 0 && arr[maxWindow.Back().Value.(int)] <= arr[R] {
maxWindow.Remove(maxWindow.Back())
}
maxWindow.PushBack(R)
//右扩
for minWindow.Len() > 0 && arr[minWindow.Back().Value.(int)] >= arr[R] {
minWindow.Remove(minWindow.Back())
}
minWindow.PushBack(R)
//如果最大值-最小值>sum,就不右扩了。
if arr[maxWindow.Front().Value.(int)]-arr[minWindow.Front().Value.(int)] > sum {
break
} else {
R++
}
}
//计数
count += R - L
//删除过期窗口数据
if maxWindow.Front().Value.(int) == L {
maxWindow.Remove(maxWindow.Front())
}
if minWindow.Front().Value.(int) == L {
minWindow.Remove(minWindow.Front())
}
}
return count
}
```
执行结果如下:
***
[左神java代码](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class24/Code02_AllLessNumSubArray.java)
[评论](https://user.qzone.qq.com/3182319461/blog/1614469165)
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
- 2025-07-29:所有安放棋子方案的曼哈顿距离。用go语言,给定三个整数 m、n 和 k,表示一个 m 行 n 列的棋盘,以
- 2025-07-28:最长特殊路径。用go语言,你有一棵无向树,节点编号从0到n-1,根节点是0。树的结构由一个长度为n-1的二
- 2025-07-27:将数组变相同的最小代价。用go语言,你有两个长度均为 n 的整型数组 arr 和 brr,还有一个整数 k
- 2025-07-26:循环数组中相邻元素的最大差值。用go语言,给定一个循环数组 nums,请找出任意两个相邻元素之间绝对差的最
- 2025-07-24:图的最大边权的最小值。用go语言,你有一个包含 n 个节点(编号 0 到 n-1)的有向带权图,图中边的信
评论(0)