蓝桥杯 云神的子数组和

原题目链接

题意

给定长度为n的整数数组,统计和等于x的连续子数组数量。

超时写法:暴力枚举(双重循环)

思路

枚举每个子数组的起点 (i),再从 (i) 向右枚举终点 (j),维护从 (i) 到 (j) 的累加和 sum

  • 每次 sum += arr[j]
  • sum == x,则答案 ans++

这样能统计所有连续子数组,但当 (n) 很大时会超时。

复杂度

  • 时间复杂度: O ( n 2 ) O(n^{2}) O(n2)

代码

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

int n, x, s = 0, e = 0, ans = 0;
int arr[100005];

int main() {
    cin >> n >> x;
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    for (int i = 0; i < n; i++) {
    int sum = 0;
        for (int j = i; j < n; j++) {
            sum += arr[j];
            if (sum == x) ans++;
        }
    }
    cout << ans;
    return 0;
}//by wqs

前缀和 + Hash 优化

思路

用前缀和思想:设当前前缀和为 sum,如果存在某个以前出现过的前缀和为 sum - x,那么从那个位置之后到当前位置的子数组和就是 (x)。

做法是用 unordered_map 统计每个前缀和出现次数:

  • 初始化 prefix_sum_unordered_map[0] = 1(表示空前缀)
  • 每读入一个数更新 sum
  • target = sum - x
  • prefix_sum_unordered_map[target] 加到答案上
  • 再把当前 sum 的计数加 1

复杂度

  • 平均时间复杂度: O ( n ) O(n) O(n)

代码

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

int n, x, s = 0, e = 0, sum = 0, ans = 0;
int arr[100005];
unordered_map<int, int> prefix_sum_unordered_map;

int main() {
	cin >> n >> x;
	prefix_sum_unordered_map[0] = 1;
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
		sum += arr[i];
		int target = sum - x;
		ans += prefix_sum_unordered_map[target];
		prefix_sum_unordered_map[sum]++;
	}
	cout << ans;
	return 0;
}//by wqs。
相关推荐
2601_9561219713 分钟前
map_计蒜客T1271 完美K倍子数组
c++·算法
编程圈子35 分钟前
电机驱动开发学习19. 霍尔 BLDC 三段式 FOC 启动算法
驱动开发·学习·算法
Hello_Damon_Nikola40 分钟前
伺服电机堵转检测算法详解
单片机·嵌入式硬件·算法
罗小罗同学1 小时前
安德森癌症中心发表SCOPE IO模型,实现了对罕见肿瘤帕博利珠单抗疗效的精准预测,在患者早期即可预判药效
人工智能·算法·医学图像处理·医学ai
变量未定义~1 小时前
Tarjan算法-强连通分量、路径、出差
算法
geovindu2 小时前
CSharp: Iterative Algorithms
开发语言·后端·算法·c#·.net·迭代算法
道影子2 小时前
《黄帝内经》021章|津凝精晶 沉降为患
人工智能·深度学习·神经网络·算法·机器学习
道影子2 小时前
《黄帝内经》022章|调和双旋 伏风自消
人工智能·深度学习·神经网络·算法·机器学习
吞下星星的少年·-·3 小时前
牛客技能树:一道GCD问题(排序,数论)
算法
m沐沐3 小时前
【计算机视觉】人脸识别三大经典算法:LBPH、Eigenfaces、FisherFaces 原理与实战
图像处理·人工智能·深度学习·opencv·算法·机器学习·计算机视觉