蓝桥杯 云神的子数组和

原题目链接

题意

给定长度为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。
相关推荐
luj_17682 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
郝学胜-神的一滴2 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
爱编程的小新☆2 小时前
【LeetCode】从递归到 Flood Fill:5 道题吃透 DFS 的选择、回溯与标记
java·算法·leetcode·深度优先·回溯·flood fill
Water_Sunzhipeng2 小时前
2024牛客暑期多校训练营1
算法
hetao17338372 小时前
2026-08-09~08-14 hetao1733837 的刷题记录
c++·算法
技术小黑3 小时前
RNN算法实战系列06 | LSTM 实现糖尿病探索与预测
rnn·算法·lstm
疯狂打码的少年3 小时前
【数据结构】二叉树的性质(五大性质+计算)
数据结构·笔记·算法
wabs6663 小时前
关于图论【A*算法 | 卡码网127.骑士的攻击的思考】
数据结构·算法·图论·卡码网·广搜的改进版
CIO_Alliance4 小时前
AI认知系列(3)| 数据、算法、算力、场景四要素协同
人工智能·算法·ipaas·系统集成·企业cio联盟·企业级ai化转型
..Dauntless..5 小时前
手写vector vs std::vector:从功能正确到性能达标
算法