OD体育(ODSports)官网入口
OD体育
你的位置:OD体育(ODSports)官网入口 > OD体育 > OD体育app官网 2026-03-19: 范围与里面和相配的踏实子数组。用go讲话, 给定一个
OD体育app官网 2026-03-19: 范围与里面和相配的踏实子数组。用go讲话, 给定一个
发布日期:2026-03-20 07:56    点击次数:167

OD体育app官网 2026-03-19: 范围与里面和相配的踏实子数组。用go讲话, 给定一个

2026-03-19:范围与里面和相配的踏实子数组。用go讲话,给定一个整数数组 capacity,请统计其中有几许个邻接区间合乎底下的要求:

• 区间内至少包含 3 个元素;

• 这个区间的第一个数和终末一个数换取;

• 况兼这两个端点的值,恰好等于它们中间系数元素的总和。

换句话说,如若某个子数组的驾驭两头相配,而且这个相配的值刚巧能被中间部分一齐加起来得到,那么这个子数组就看成一个“踏实”子数组。

你的任务是:复返这么的子数组总和。

3

-1000000000

输入: capacity = [9,3,3,3,9]。

输出: 2。

评释:

[9,3,3,3,9] 是踏实数组,因为首尾元素齐是 9,且它们之间元素之和为 3 + 3 + 3 = 9。

[3,3,3] 是踏实数组,因为首尾元素齐是 3,且它们之间元素之和为 3。

题目来独力扣3728。

一、算法举座大体经过(分圭臬详备描写)

圭臬1:界说中枢用具

1. 前缀和数组:prefix[i] 默示数组前i个元素的累加和(快速贪图恣意区间和);

2. 哈希表(字典):存储键值对,键是二元组 (现时元素值, 前缀和值),值是该二元组出现的次数;

作用:快速查找称心条目的左端点L,幸免暴力遍历系数子数组。

圭臬2:开动化变量

1. 开动化谜底计数器:用于统计合乎条目的踏实子数组数目(开动为0);

2. 开动化前缀和:从数组第一个元素脱手贪图;

3. 开动化哈希表:为空,后续动态存入二元组。

圭臬3:遍历数组(右指针遍历,从第二个元素脱手)

以右指针r代表子数组的右端点,逐一遍历数组元素,中枢逻辑分3步:

1. 查询匹配的左端点

以现时右端点值capacity[r]、现时前缀和为条目,去哈希表中查找:

有莫得左端点L 称心:

• capacity[L] = capacity[r](首尾相配);

• prefix[L] + capacity[L] = 前缀和(中间和等于端点值)。

查到的次数,径直累加到谜底计数器中(每一次匹配齐对应一个踏实子数组)。

2. 存入新的二元组到哈希表

将左候选点(现时右指针的前一个元素)的二元组:

(capacity[r-1], prefix[r-1] + capacity[r-1])

存入哈希表,澳门新浦京计数+1(为后续的右端点提供匹配依据)。

3. 更新前缀和

把现时元素的值加到前缀和中,继续下一轮遍历。

圭臬4:遍历已毕,复返话案

遍历完成后,谜底计数器的值便是系数合乎条目的踏实子数组数目。

二、示例推演(输入 [9,3,3,3,9])

数组索引:0(9)、1(3)、2(3)、3(3)、4(9)

指标为止:2个踏实子数组 [0,4]、[1,3]

1. 开动:前缀和=9(索引0),哈希表空,OD体育app谜底=0;

2. r=1(元素3):查询无匹配,存入(9, 9+9=18),前缀和更新为12;

3. r=2(元素3):查询无匹配,存入(3, 3+12=15),前缀和更新为15;

4. r=3(元素3):查询哈希表,匹配到(3,15),谜底+1(对应子数组[1,3]),存入(3,3+15=18),前缀和更新为18;

5. r=4(元素9):查询哈希表,匹配到(9,18),谜底+1(对应子数组[0,4]),存入新二元组,前缀和更新为27;

最终谜底=2,与预期一致。

三、时候复杂度 & 独特空间复杂度

1. 时候复杂度

• 算法仅一次遍历数组,遍历次数为数组长度n;

• 哈希表的查询、插入操作齐是平均 O(1) 时候;

• 总时候复杂度:O(n)

• 适配题目要求:数组长度最高10⁵,O(n)算法可高效运行。

2. 独特空间复杂度

• 仅使用了一个哈希表存储二元组;

• 哈希表最多存储n个键值对(遍历中每个元素最多存入一次);

• 无其他大限制数据结构;

• 总独特空间复杂度:O(n)

回想

1. 算法中枢:前缀和+哈希表,将暴力O(n²)优化为O(n);

2. 经过:右指针遍历→哈希表查匹配左端点→更新谜底→存入新候选→更新前缀和;

3. 复杂度:时候O(n),空间O(n),好意思满适配大数据量的题目要求。

Go完整代码如下:

package main

import (

"fmt"

)

func countStableSubarrays(capacity []int) (ans int64) {

type pair struct{ x, s int }

cnt := map[pair]int{}

sum := capacity[0] // 前缀和

for r := 1; r

ans += int64(cnt[pair{capacity[r], sum}])

cnt[pair{capacity[r-1], capacity[r-1] + sum}]++

sum += capacity[r]

}

return

}

func main {

capacity := []int{9, 3, 3, 3, 9}

result := countStableSubarrays(capacity)

fmt.Println(result)

}

Python完整代码如下:

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

from typing import List

from collections import defaultdict

def count_stable_subarrays(capacity: List[int]) -> int:

"""

贪图踏实子数组的数目

参数:

capacity: 整数列表

复返:

踏实子数组的数目

"""

ans = 0

# 使用字典来存储pair计数,Python中的元组不错径直作为字典键

cnt = defaultdict(int)

# 前缀和

prefix_sum = capacity[0]

# 从索引1脱手遍历

for r in range(1, len(capacity)):

# 查询并累加合乎条目的子数组数目

ans += cnt[(capacity[r], prefix_sum)]

# 更新计数

cnt[(capacity[r-1], capacity[r-1] + prefix_sum)] += 1

# 更新前缀和

prefix_sum += capacity[r]

return ans

def main:

# 测试用例

capacity = [9, 3, 3, 3, 9]

result = count_stable_subarrays(capacity)

print(result)

if __name__ == "__main__":

main

C++完整代码如下:

#include

#include

#include

#include

using namespace std;

// 界说pair结构体,用于作为map的键

struct Pair {

int x; // 元素值

int s; // 和/前缀和

// 需要界说相比运算符才智作为map的键

bool operator

if (x != other.x) return x

return s

}

};

long long countStableSubarrays(vector& capacity) {

long long ans = 0;

map cnt; // 使用map代替Go的map

int sum = capacity[0]; // 前缀和

for (int r = 1; r

// 查询并累加合乎条目的子数组数目

ans += cnt[{capacity[r], sum}];

// 更新计数

cnt[{capacity[r-1], capacity[r-1] + sum}]++;

// 更新前缀和

sum += capacity[r];

}

return ans;

}

int main {

// 测试用例

vector capacity = {9, 3, 3, 3, 9};

long long result = countStableSubarrays(capacity);

cout

return0;

}

咱们折服东说念主工智能为平庸东说念主提供了一种“增强用具”,并发愤于共享全方针的AI学问。在这里,您不错找到最新的AI科普著述、用具评测、援手成果的诡秘以及行业细察。

迎接心绪“福大大架构师逐日一题”OD体育app官网,发音问可获取口试辛劳,让AI助力您的将来发展。

幸运彩app官方网站下载