统计和——前缀和

2023-11-16

题目大概:

  给定一个长度为n的整数数组和一个整数k,你需要找到该数组中和为k的连续子数组的个数,

测试样例:

输入:

5 3
1 1 2 1 1

输出:

2

  思路1:

    利用for循环暴力枚举子数组,并且求和+计数,时间复杂度为O(n^3)。(如果数据大于了100,这个思路绝对Time Limit Exceeded(时间超时),所以要进行优化)!

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,k; //定义 
	scanf("%d%d",&n,&k); //输入 
	int a[n],sum=0; //定义数组和计数器 
	for(int i=0;i<n;i++) //for循环输入 
	  scanf("%d",a[i]); //输入下标为i的数 
	for(int i=0;i<n;i++){ //区间i枚举 
		for(int j=0;j<n;j++){ //区间j枚举 
			int ans=0; //区间和计数数组 
			for(int x=i;x<=j;x++) //求出区间[i,j]的和 
			  ans+=a[i]; //计数 
			if(ans==k) //比较 
			  sum++; //计数	  
		}
	}
	cout<<sum<<endl; //输出 
	return 0;
}

思路2:

  我们还可以使用前缀和来解决这个问题,首先预处理出a的前缀数组sum,每次求出子数组的和,然后进行双重循环的区间枚举,然后与k进行比较,时间复杂度为O(n^2).(如果数据不大于1500,是可以AC的,还有优化空间)。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,k; //定义 
	scanf("%d%d",&n,&k); //输入 
	int sum[n+1]={0},ans=0; //定义前缀和数组sum和计数器ans 
	sum[0]=0; //将下标为0的地址初始化为0  
	for(int i=1;i<=n;i++){ //进行循环n次读入 
		int a; //定义 
		scanf("%d",&a); //输入 
		sum[i]=sum[i-1]+a; //求前缀和 
	}
	for(int i=1;i<=n;i++) //区间枚举i 
	  for(int j=0;j<n;j++) //区间枚举j 
	    if(sum[i]-sum[j]==k) //求出区间[i,j]的和与k比较 
	      ans++; //计数器加1 
	cout<<ans<<endl; //输出计数器 
	return 0; //结束 
}

思路3:

  我们可以使用map(STL库定义的类),加上前缀和进行优化。在单用前缀和的思路中,我们要求一个结尾下标为i的子数组的和是否为k,就需要对j从0开始遍历到i-1,来找到是否存在sum[i]-k=sum[j]。那么我们只用map来存前i个元素的前缀和,把出现的次数(>i)之前的前缀和的值保存下来,最后判断map中是否包含sum[i]-k即可。

  时间复杂度为O(n),已经算是很快的了,数据大到几百万都可以AC了。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,k; //定义 
	scanf("%d%d",&n,&k); //输入 
	int sum[n+1]={0},ans=0; //定义前缀和数组sum和计数器ans 
	sum[0]=0; //将下标为0的地址初始化为0  
	map<int,int> p; //定义map 
	for(int i=1;i<=n;i++){ //进行循环n次读入 
		int a; //定义 
		scanf("%d",&a); //输入 
		sum[i]=sum[i-1]+a; //求前缀和 
		p[sum[i]]++; //进行存储 
	}
	for(int i=0;i<n;i++) //进行区间判断 
	  ans+=p[sum[i]+k]; //计数 
	cout<<ans<<endl; //输出 
	return 0; //结束 
}

总结:

  该题是前缀和中很经典的一道题目,相当于敲门砖了,后面还有更难的差分、二维前缀和等……

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

统计和——前缀和 的相关文章

  • C++ 析构函数和函数调用顺序

    假设我有以下代码片段 Foo foo return bar 现在 C 标准是否保证 bar 将在 foo Foo 之前调用 或者这是编译器 实现的选择 Thanks 这是有保证的行为 实际执行过程如下 0 enter block scope
  • 如何在 wpf 密码框设置一些默认文本? [复制]

    这个问题在这里已经有答案了 可能的重复 WPF 中的水印文本框 https stackoverflow com questions 833943 watermark textbox in wpf 我可以知道如何在 WPF 的密码框中放入一些
  • 实现 `memcpy()`:需要 `unsigned char *`,还是只需要 `char *`?

    我正在实施一个版本memcpy 能够与它一起使用volatile 使用安全吗char 或者我需要unsigned char volatile void memcpy v volatile void dest const volatile v
  • C# 中的简单获取字符串(忽略末尾的数字)

    我认为正则表达式太过杀伤力 而且它需要我一些时间来编写一些代码 我想我现在应该学习 因为我知道一些正则表达式 分隔字母数字字符串中的字符串的最简单方法是什么 它将永远是 LLLLDDDDD 我只想要字母 l 通常只有 1 或 2 个字母 T
  • LINQ TO ENTITY 无法与枚举类型进行比较

    下面是枚举叶子 public enum Leaves Annual 0 Medical 1 Hospitalization 2 Unpaid 3 下面是linq查询 public ActionResult ApproveLeave int
  • 在opencv中保存帧而不压缩

    我正在尝试使用写 OpenCV 函数 我想保存帧 TIFF扩大 我遇到的问题是保存的图像被压缩 所以我无法使用它们 知道如何摆脱这种压缩吗 提前致谢 不要介意西奇说的话 TIFF 标志通过 LZW 压缩硬编码在 opencv 二进制文件中
  • 获取 WSA 错误代码的格式化消息

    我在 win32 C 应用程序中使用winsock2 我将使用 MessageBox 显示可以通过调用 WSAGetLastError 检索的网络错误 我怎样才能做到这一点 我看到 FormatMessage 但我不明白如何使用它 例如 以
  • C# Socket.receive连续接收0字节且循环中不阻塞

    我正在尝试用 C 编写一个最简单的多线程 TCP 服务器 它接收来自多个客户端的数据 每次连接新客户端时 都会建立套接字连接 并将套接字作为参数传递给新类函数 之后运行 while 循环并接收数据 直到客户端连接为止 这里的问题是 sock
  • 在运行时配置 ASP.NET 会话状态

    我们有一个使用 SQL Server 会话状态的 ASP NET 网站 状态配置在Web config like
  • 是否有一种快速替代方法可以从 XNA 中的位图对象创建 Texture2D?

    我环顾四周 发现从位图创建Texture2D的唯一方法是 using MemoryStream s new MemoryStream bmp Save s System Drawing Imaging ImageFormat Png s S
  • EWS 消息跟踪报告

    我一直在研究如何使用 EWS 从交换中获取消息跟踪报告 但似乎无法查明任何内容 我打算构建一个抓取日志文件的应用程序 但如果我可以通过 EWS 来完成它 那对我正在做的事情会更好 有任何想法吗 我终于能够为我的问题创建一个解决方案 我在 C
  • 如何设置属性选择器的值 Expression>

    我需要使用模式工厂的想法将 Person 类实体中的实体属性 Address 与 FactoryEntities 类中的表达式 linq 相关联 看看这就是我所拥有的并且我想要做的 Address address new Address a
  • 在 Asp.net Web API 中处理 CORS 预检

    我的架构中有三个应用程序 它们位于同一服务器上 但具有不同的端口号 A Token Application port 4444 Asp net WebApi B API Application port 3333 Asp net WebAp
  • 如何存储生成的格式化 C 字符串

    这是一个新手问题 为了创建格式化的 C 字符串 我使用printf like int n 10 printf My number is i 10 但是 怎么样 int n 10 char msg My number is i 10 prin
  • 将 size_t 变量添加到指针

    我想向指针添加 size t 类型 有些像这样 void function size t sizeA size t sizeB void pointer pointer malloc sizeA pointer pointer sizeB
  • 如何对具有无效值的属性使用 JSON.net 的默认值

    我正在使用 Newtonsoft JSON 库来反序列化来自 Web 服务的响应 问题是某些字段包含无效值 例如 一条记录上的一个字段包含一个 T 表示该字段应该是数字 我想做的是将无效字段的值设置为 null 或其他默认值 我的所有属性都
  • 委托:方法名称预期错误

    我正在尝试让以下简单的委托示例正常工作 根据我从中取出的一本书 应该没问题 但我得到了Method name expected error namespace TestConsoleApp class Program private del
  • 使用C#在SQL Server上执行sql文件

    我有很多程序 视图 函数等文件 我想在 SQL Server 2005 2008 上的适当数据库中执行这些文件 创建组件 还有一点是我想使用 C 来执行它们 另一点需要提及的是 我希望应用程序也可以在远程 SQL Server 上执行此文件
  • C++ 头文件包含

    我正在开发一个项目 每个头文件都有一个预处理器包含防护 我的包含是这样的 文件 gt 包含 main cpp gt header h 字符 h header h gt 矢量 iostream DataFiles h Character h
  • 我如何将 C++ 与 VALA 混合起来

    我需要用 C 编写跨平台的 GUI 应用程序 但由于 C 的大多数 GUI 库都有点乏味 而且我对 C NET 非常熟悉 我发现使用 GTK 的代码 Vala 代码非常有趣 并且与其他方式相比有点容易 那么我该如何将 VAlA 与 C 混合

随机推荐

  • 删除数据库的sql语句

    删除数据库的sql语句如何写 drop database 数据库名 删除数据库的 drop table 表名 删除表的 delete from 表名 where 条件 删除数据的 truncate table 表名 也是删除数据库的 但是他
  • Qt—事件的处理

    事件的处理 一个事件由一个特定的QEvent子 类来表示 但是有时一个事件又包含多个事件类型 比如鼠标事件又可以分为鼠标按下 双击和移动等多种操作 这些事件类型都由QEvent类的枚举型QEvent Type来表示 其中包含了一百多种事件类
  • librdkafka的使用和介绍

    librdkafka的使用介绍 librdkafka是kafka的c语言接口 下面简单的介绍一下其接口 1 rd kafka conf set设置全局配置 2 rd kafka topic conf set设置topic配置 3 rd ka
  • MySQL IP地址存储和转换

    存储 保存IP地址到数据库 建议使用整型 首先可以节省存储空间 例如保存IP地址 255 255 255 255 如果使用字符串形式的IP 那么需要VARCHAR 15 来存放 而使用整型的话 用二进制是111111111111111111
  • Oulipo

    点击打开链接 Problem Description The French author Georges Perec 1936 1982 once wrote a book La disparition without the letter
  • anaconda虚拟环境python升级_Anaconda的安装与虚拟环境建立

    电脑配置 Windows10 64位操作系统 一 Anaconda的介绍 Anaconda指的是一个开源的Python发行版本 其包含了conda Python等180多个科学包及其依赖项 因为包含了大量的科学包 Anaconda 的下载文
  • 【LTspice】006 实际电容 阻抗特性曲线

    目录 1 电路图 2 仿真条件 3 电容元件选型 及 寄生参数 4 仿真结果分析 1 电路图 我们可以利用仿真软件的AC分析功能绘制电容的阻抗特性曲线 如下 放置一电容和电压源 设置如下图所示 2 仿真条件 AC 1 电压源指定小信号交流分
  • mysql日期相减操作

    一 MySQL中两个DateTime字段相减 假定表名为tblName 两个DateTime字段名分别为beginDateTime endDateTime 以下是相关两个mysql日期字段相减的SQL语句 这种方式两字段跨天 月 年都无问题
  • Android Studio教程从入门到精通

    转自 http blog csdn net yanbober article details 45306483 目标 Android Studio新手 gt 下载安装配置 gt 零基础入门 gt 基本使用 gt 调试技能 gt 构建项目基础
  • Journal of Proteome Research

    文献名 Lipidomics reveals similar changes in serum phospholipid signatures of overweight and obese paediatric subjects 用脂质组
  • pytorch1.13安装

    pytorch1 13安装 个人参考 情况交代 安装流程 注意事项 显卡配置查看 创建环境 激活环境 安装对应的torch版本 检查 使用pip list 导入查看 卸载 下载gpu版本的 验证 把这个内核加到jupyter 完成 情况交代
  • 挂载mount问题“wrong fs type, bad option, bad superblock on ”的解决办法

    重装系统后挂载一般会出现如下问题 problem ivy ivy OptiPlex 380 source sudo mount 192 168 9 18 home deep dev env source mount wrong fs typ
  • makefile进阶

    一 微观的C C 编译执行过程 c文件怎么变成可执行文件 exe 1 预处理 E 宏替换 头文件展开 去打印 gcc E hello c o hello i 2 编译 S 把 i 文件编译成汇编代码文件 i gcc S hello i o
  • 火星探险 (Mars)

    暂无链接 题目描述 在2051年 若干火星探险队探索了这颗红色行星的不同区域并且制作了这些区域的地图 现在 Baltic空间机构有一个雄心勃勃的计划 他们想制作一张整个行星的地图 为了考虑必要的工作 他们需要知道地图上已经存在的全部区域的大
  • canvas画布组件

    代码编写 在画布上添加各种几何图形 from tkinter import root Tk 设置主窗口区的背景顔色以区别画布区的顔色 root config bg 8DB6cD root title 基于tk的canvas几何图形 root
  • 附录2 高斯分布与马氏距离

    给定随机变量 xi i 1 N x i i 1
  • 深度学习优化器

    1 什么是优化器 优化器用来寻找模型的最优解 2 常见优化器 2 1 批量梯度下降法BGD Batch Gradient Descent 2 1 1 BGD表示 BGD 采用整个训练集的数据来计算 cost function 对参数的梯度
  • Vue技术 Object.defineProperty

    Object defineProperty 是JavaScript中的一个内置方法 用于定义或修改对象的属性 它接受三个参数 对象 属性名 以及一个属性描述符对象 属性描述符对象有两种形式 数据描述符和访问描述符 数据描述符用于定义普通属性
  • 【蓝桥杯】Java组必备API类 --快速读写实现方法 及输入输出的巧妙处理

    输入和输出 输入 Scanner s new Scanner System in 声明一个从控制台中读入数据的对象 int x s nextInt double x s nextDouble String x s next 无法读入空格 S
  • 统计和——前缀和

    题目大概 给定一个长度为n的整数数组和一个整数k 你需要找到该数组中和为k的连续子数组的个数 测试样例 输入 5 3 1 1 2 1 1 输出 2 思路1 利用for循环暴力枚举子数组 并且求和 计数 时间复杂度为O n 3 如果数据大于了