网易首页 > 网易号 > 正文 申请入驻

2026-06-08:开销小于等于 K 的子数组数目。用go语言,给定整数数组 nums 和整数 k。 对数组中任意一个连续非空子数组 nums[l.....

0
分享至

2026-06-08:开销小于等于 K 的子数组数目。用go语言,给定整数数组 nums 和整数 k。
对数组中任意一个连续非空子数组 nums[l..r],先找出该子数组的最大值 max 和最小值 min。然后用它们的差值乘以子数组长度 (r - l + 1),得到该子数组的“代价”。

题目要求:统计 nums 里所有子数组中,代价不超过 k 的子数组一共有多少个,并返回这个数量。

1 <= nums.length <= 100000。

1 <= nums[i] <= 1000000000。

0 <= k <= 1000000000000000。

输入: nums = [1,3,2], k = 4。

输出: 5。

解释:

考虑 nums 的所有子数组:

nums[0..0]: cost = (1 - 1) * 1 = 0

nums[0..1]: cost = (3 - 1) * 2 = 4

nums[0..2]: cost = (3 - 1) * 3 = 6

nums[1..1]: cost = (3 - 3) * 1 = 0

nums[1..2]: cost = (3 - 2) * 2 = 2

nums[2..2]: cost = (2 - 2) * 1 = 0

共有 5 个子数组的开销小于或等于 4。

题目来自力扣3835。

逐步骤详细执行过程

初始状态:

  • • 左指针left = 0

  • • 最小队列minQ空,最大队列maxQ

  • • 答案ans = 0

  • • 数组:[1, 3, 2],索引0、1、2

第一步:遍历右边界 right = 0,元素值 = 1 1. 元素入队(维护两个单调队列)
  • • 最小队列:空,直接把下标0加入 →minQ = [0](队首是当前最小值)

  • • 最大队列:空,直接把下标0加入 →maxQ = [0](队首是当前最大值)

2. 检查窗口是否合法(代价 ≤k)

当前窗口[0,0]
最大值=1,最小值=1,差值=0
长度=1
代价=0×1=0 ≤4 → 窗口合法,不移动左指针

3. 统计合法子数组数量

right=0结尾的合法子数组:只有[0,0]
答案累加:ans = 0 + 1 = 1

第二步:遍历右边界 right = 1,元素值 = 3 1. 元素入队(维护两个单调队列)

  • • 最小队列:当前元素3 ≥ 队尾下标0对应的值1,不破坏单调递增,直接加入 →minQ = [0,1]

  • • 最大队列:当前元素3 ≥ 队尾下标0对应的值1,需要弹出队尾,队列变空后加入 →maxQ = [1]

2. 检查窗口是否合法

当前窗口[0,1]
最大值=3(队首1),最小值=1(队首0),差值=2
长度=2
代价=2×2=4 ≤4 → 窗口合法,不移动左指针

3. 统计合法子数组数量

right=1结尾的合法子数组:[0,1][1,1]→ 共2个
答案累加:ans = 1 + 2 = 3

第三步:遍历右边界 right = 2,元素值 = 2 1. 元素入队(维护两个单调队列)

  • • 最小队列:当前元素2 ≤ 队尾下标1对应的值3,弹出队尾;队列变为[0],2 ≥ 下标0对应的值1,加入 →minQ = [0,2]

  • • 最大队列:当前元素2 ≤ 队尾下标1对应的值3,不破坏单调递减,直接加入 →maxQ = [1,2]

2. 检查窗口是否合法(关键:窗口不合法,移动左指针)

当前窗口[0,2]
最大值=3(队首1),最小值=1(队首0),差值=2
长度=3
代价=2×3=6 >4 →窗口不合法

  • • 左指针右移:left = 1

  • • 检查最小队列:队首0 < left=1,弹出 →minQ = [2]

  • • 检查最大队列:队首1 ≥ left=1,保留

现在窗口[1,2]
最大值=3(队首1),最小值=2(队首2),差值=1
长度=2
代价=1×2=2 ≤4 → 窗口合法,停止移动左指针

3. 统计合法子数组数量

right=2结尾的合法子数组:[1,2][2,2]→ 共2个
答案累加:ans = 3 + 2 = 5

遍历结束

最终总答案 = 5,和题目输出完全一致。

时间复杂度 & 额外空间复杂度 1. 总时间复杂度:O(n)

  • • 滑动窗口:左右指针leftright只会向右移动,绝不回退,总共最多移动2n次;

  • • 单调队列:每个数组元素只会入队一次、出队一次,没有重复操作;

  • • 所有操作都是线性的,与数组长度n成正比。

2. 总额外空间复杂度:O(n)
  • • 额外使用了两个单调队列存储数组下标;

  • • 最坏情况下(数组严格递增/递减),队列会存储全部n个元素;

  • • 除了输入输出和变量,仅占用线性级别的额外空间。

总结
  1. 1. 执行过程:逐一遍历右边界→维护双队列获取窗口最值→检查窗口合法性→移动左指针→统计合法子数组数量并累加;

  2. 2. 时间复杂度:O(n)(线性时间,适合10万长度的数组);

  3. 3. 额外空间复杂度:O(n)(两个单调队列的最大存储量)。

Go完整代码如下:

package main

import (
"fmt"
)

func countSubarrays(nums []int, k int64) (ans int64) {
var minQ, maxQ []int
left := 0
for right, x := range nums {
// 1. 入:元素进入窗口
forlen(minQ) > 0 && x <= nums[minQ[len(minQ)-1]] {
minQ = minQ[:len(minQ)-1]
}
minQ = append(minQ, right)

forlen(maxQ) > 0 && x >= nums[maxQ[len(maxQ)-1]] {
maxQ = maxQ[:len(maxQ)-1]
}
maxQ = append(maxQ, right)

// 2. 出:如果窗口不满足要求,左端点离开窗口
// 只需改下面这行代码,其余逻辑和 2762 题完全一致
forint64(nums[maxQ[0]]-nums[minQ[0]])*int64(right-left+1) > k {
left++
if minQ[0] < left {
minQ = minQ[1:]
}
if maxQ[0] < left {
maxQ = maxQ[1:]
}
}

// 3. 更新答案
ans += int64(right - left + 1)
}
return
}

func main() {
nums := []int{1, 3, 2}
k := 4
result := countSubarrays(nums, int64(k))
fmt.Println(result)
}

Python完整代码如下:

# -*-coding:utf-8-*-

from collections import deque

def countSubarrays(nums, k):
ans = 0
minQ = deque()
maxQ = deque()
left = 0
for right, x in enumerate(nums):
# 1. 入:元素进入窗口
while minQ and x <= nums[minQ[-1]]:
minQ.pop()
minQ.append(right)
while maxQ and x >= nums[maxQ[-1]]:
maxQ.pop()
maxQ.append(right)
# 2. 出:如果窗口不满足要求,左端点离开窗口
while maxQ and minQ and (nums[maxQ[0]] - nums[minQ[0]]) * (right - left + 1) > k:
left += 1
if minQ and minQ[0] < left:
minQ.popleft()
if maxQ and maxQ[0] < left:
maxQ.popleft()
# 3. 更新答案
ans += right - left + 1
return ans

def main():
nums = [1, 3, 2]
k = 4
result = countSubarrays(nums, k)
print(result)

if __name__ == "__main__":
main()

C++完整代码如下:

  




using namespace std;

long long countSubarrays(vector& nums, long long k) {
long long ans = 0;
deque minQ, maxQ;
int left = 0;

for (int right = 0; right < nums.size(); right++) {
int x = nums[right];

// 1. 入:元素进入窗口
while (!minQ.empty() && x <= nums[minQ.back()]) {
minQ.pop_back();
}
minQ.push_back(right);

while (!maxQ.empty() && x >= nums[maxQ.back()]) {
maxQ.pop_back();
}
maxQ.push_back(right);

// 2. 出:如果窗口不满足要求,左端点离开窗口
while (!minQ.empty() && !maxQ.empty() &&
(long long)(nums[maxQ.front()] - nums[minQ.front()]) * (right - left + 1) > k) {
left++;
if (!minQ.empty() && minQ.front() < left) {
minQ.pop_front();
}
if (!maxQ.empty() && maxQ.front() < left) {
maxQ.pop_front();
}
}

// 3. 更新答案
ans += (right - left + 1);
}

return ans;
}

int main() {
vector nums = {1, 3, 2};
long long k = 4;
long long result = countSubarrays(nums, k);
cout << result << endl;
return0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
人过80岁,哪怕身体再健康,也要记住这四句话,晚年远离病痛

人过80岁,哪怕身体再健康,也要记住这四句话,晚年远离病痛

观星赏月
2026-07-03 12:03:48
上海炒股冠军罕见发声:如果散户死拿股票不撒手,庄家会怎么办?

上海炒股冠军罕见发声:如果散户死拿股票不撒手,庄家会怎么办?

股经纵横谈
2026-06-30 20:45:10
还是做好准备吧,一美元只能兑换5.5元人民币时代,或许终会到来

还是做好准备吧,一美元只能兑换5.5元人民币时代,或许终会到来

阅识
2026-01-31 15:32:50
美国军队到底有多富裕?又富裕到了什么程度?

美国军队到底有多富裕?又富裕到了什么程度?

怪味历史连连看
2026-07-13 22:07:35
游客不敢来了,俄拿出43亿卢布给克里米亚旅游业续命

游客不敢来了,俄拿出43亿卢布给克里米亚旅游业续命

桂系007
2026-07-12 03:05:09
与美合作、加速入盟,乌克兰宣布全面调整国家政治战略

与美合作、加速入盟,乌克兰宣布全面调整国家政治战略

上观新闻
2026-07-13 14:58:22
河南女子相亲第一次见面就要去商场买六万块钱五金,小伙当场拒绝

河南女子相亲第一次见面就要去商场买六万块钱五金,小伙当场拒绝

捣蛋窝
2026-07-13 23:45:11
一纸任免令通告全国,消失数月的内贾德现身,伊朗这盘棋要变了吗

一纸任免令通告全国,消失数月的内贾德现身,伊朗这盘棋要变了吗

莫地方
2026-07-13 22:56:50
建国后,许世友在南京外出散步碰到歹徒抢劫,将军说:把东西放下

建国后,许世友在南京外出散步碰到歹徒抢劫,将军说:把东西放下

文史漫笔
2026-07-13 07:25:11
不必为蒋方舟硕士学位被撤销而庆祝

不必为蒋方舟硕士学位被撤销而庆祝

关尔东
2026-07-13 23:26:55
去澡堂洗澡才发现,女人和女人之间也有不一样的地方

去澡堂洗澡才发现,女人和女人之间也有不一样的地方

新时代的两性情感
2026-07-11 08:13:04
7月15日入伏,少吃猪肉和鸡肉,这3种肉敞开吃,营养解馋易消化,好吃不贵,元气满满过夏天!

7月15日入伏,少吃猪肉和鸡肉,这3种肉敞开吃,营养解馋易消化,好吃不贵,元气满满过夏天!

秀厨娘
2026-07-13 21:02:44
比亚迪新车,今天正式官宣!

比亚迪新车,今天正式官宣!

电动内参
2026-07-14 02:25:50
辛纳温网两连冠:最沉默的冠军,最令人窒息的统治力

辛纳温网两连冠:最沉默的冠军,最令人窒息的统治力

竞技风云录
2026-07-14 01:29:44
史无前例的荣耀,梅西与登贝莱有望达成“双圈金满贯”成就

史无前例的荣耀,梅西与登贝莱有望达成“双圈金满贯”成就

懂球帝
2026-07-14 01:37:06
彭德怀打仗那么厉害,为啥带出来的名将却不多?陈毅评价一语中的

彭德怀打仗那么厉害,为啥带出来的名将却不多?陈毅评价一语中的

浩渺青史
2026-07-13 17:41:03
《九个弹孔》邝春庭、袁少康牺牲,李智信第四次被抓,向群成救星

《九个弹孔》邝春庭、袁少康牺牲,李智信第四次被抓,向群成救星

小椰的奶奶
2026-07-14 00:53:46
施南生病重入院,前夫徐克再次探望曝病情,离婚12年仍是重要的人

施南生病重入院,前夫徐克再次探望曝病情,离婚12年仍是重要的人

小疯子耶
2026-07-11 10:15:59
苹果手机20周年革新外观!iPhone 20回归玻璃:淘汰铝合金

苹果手机20周年革新外观!iPhone 20回归玻璃:淘汰铝合金

快科技
2026-07-13 14:58:20
深圳公安:9月30日前主动上缴,可从轻、减轻或免罚!速自查

深圳公安:9月30日前主动上缴,可从轻、减轻或免罚!速自查

南方都市报
2026-07-13 08:29:59
2026-07-14 03:52:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1335文章数 71关注度
往期回顾 全部

科技要闻

OpenAI与Anthropic互掐,最强AI也怕你不用

头条要闻

前妻施南生离世 徐克深夜在医院门口发声

头条要闻

前妻施南生离世 徐克深夜在医院门口发声

体育要闻

世界杯月赚1.7亿,51岁的他仍是顶流

娱乐要闻

具俊晔“深情人设”崩塌,遗产瓜开撕

财经要闻

SK海力士暴跌15%原因找到了?

汽车要闻

小米澎程N90 Max工信部信息曝光 全尺寸旗舰 露营版首秀

态度原创

教育
亲子
时尚
手机
军事航空

教育要闻

父母说到做到,才是永不塌房的好教育

亲子要闻

感谢大家一直以来的惦记,母子已安全到家,一起来看看混血萌娃吧

papi酱,吓坏内娱

手机要闻

iQOO 16细节再曝,或9月发布

军事要闻

美国宣布实施打击 伊朗表态“放马过来”

无障碍浏览 进入关怀版