【前缀和】LeetCode 560. 和为k的字数组

news2024/11/23 11:26:34

文章目录

    • 题目描述
    • 方法1 暴力
    • 方法2 暴力优化
    • 方法3 前缀和
    • 方法4 前缀和优化

题目描述

力扣560题,链接:https://leetcode.cn/problems/subarray-sum-equals-k

在这里插入图片描述

方法1 暴力

暴力法,三重for循环,时间复杂度 O ( N 3 ) O(N^3) O(N3),会超时。
思路:两个for循环遍历起始位置和终止位置,第三个for遍历求解这段区间的和是否为k。

代码略。

方法2 暴力优化

在暴力法中我们发现会在很多重复计算,比如求前10个数据的和时只需要在前9个和的基础上加上第10个数,因此我们可以在遍历起始和终止位置时顺便求出这段区间的和,减少一个for循环。

时间复杂度 O ( N 2 ) O(N^2) O(N2)

	public int subarraySum(int[] nums, int k) {

		int len = nums.length;
		int res = 0;

		for (int i = 0; i < len; i++) { // 起始位置
			int s = 0; // 当前起始位置时,每个终止位置的和
			for (int j = i; j < len; j++) { // 终止位置
				s += nums[j];

				if(s == k)res++; // 等于k,答案+1
			}
		}
		return res;
    }

方法3 前缀和

假如一数组num为[1,2,3,4],则其前缀和数组prefixSum为[0,1,3,6,10],表示数据num中每一项到数据第一项的和,其中前缀为空时的前缀和为0,即prefixSum[0] = 0。

prefixSum[0] = 0
prefixSum[1] = a0
prefixSum[2] = a0 + a1
prefixSum[3] = a0 + a1 + a2
连续数组a1、a2的和为prefixSum[3]-prefixSum[1]
连续数组a0、a1、a2的和为prefixSum[3]-prefixSum[0]

求连续字数组和为k的数量 转换为 求解前缀数组之差的数量

因此,首先初始化前缀数组,然后依次求出前缀数组之差为k的数量。时间复杂度 O ( N 2 ) O(N^2) O(N2)

	public int subarraySum(int[] nums, int k) {

		int len = nums.length;
		int res = 0; // 最终答案

		int[] preSum = new int[len+1]; // 前缀数组
		preSum[0] = 0;
		int s = 0;
		for (int i = 0; i < len; i++) { // 前缀数组赋值
			s+=nums[i];
			preSum[i+1] = s;
		}
		/**
		 * 遍历前缀数组
		 * 注意:前缀数组的长度为原始数组长度+1,原数组长度
		 *
		 */
		for (int i = 1; i < len+1; i++) { // 从原数组nums第一个数据开始
			for (int j = i; j < len+1; j++) {
				if(preSum[j]-preSum[i-1]==k) res++;
			}
		}
		return res;
	}

方法4 前缀和优化

使用哈希表优化,存储存储每个前缀和出现的个数

遍历数组,计算每个位置的前缀和,并用哈希表存储每个前缀和出现的次数。在计算前缀和时,通过检查哈希表中是否存在前缀和为 s-k 的记录,来找到以当前位置为结尾的子数组中和为 k 的子数组数量。时间复杂度 O ( N ) O(N) O(N)

	public int subarraySum(int[] nums, int k) {

		int len = nums.length;
		int res = 0; // 最终答案
		HashMap<Integer, Integer> map = new HashMap<>(); // 利用字典存储前缀和以及对应个数
		map.put(0,1); // 初始状态下,前缀和为0的有1个

		int s = 0;// s :从0位置到i位置的和
		for (int i = 0; i < len; i++) {
			s += nums[i]; // 从0位置到i位置的和 为 s
			if(map.containsKey(s-k)){ // 找出 前缀和为s-k 所对应的数量
				res += map.get(s-k);  // map.get(s-k)表示以当前位置为结尾的子数组中和为 k 的子数组数量
			}
			map.put(s,map.getOrDefault(s,0)+1); // 更新字典
		}
		return res;
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/785948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[回馈]ASP.NET Core MVC开发实战之商城系统(二)

经过一段时间的准备&#xff0c;新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始&#xff0c;在之前的文章中&#xff0c;讲解了商城系统的整体功能设计&#xff0c;页面布局设计&#xff0c;环境搭建&#xff0c;系统配置&#xff0c;及首页商品类型&#xff0c;bann…

一百三十五、Azkaban——AzkabanWebServer服务开启后秒退

一、问题 Azkaban的AzkabanWebServer服务开启后秒退&#xff0c;造成Azkaban的页面登录不上 AzkabanWebServer服务开启后&#xff0c;第一个jps里面有AzkabanWebServer&#xff0c;随后第二个jps里面没有AzkabanWebServer 二、问题原因 MySQL中azkaban数据库的表executors的…

PDF转换成word乱码了怎么办?最实用的方法在这里!

在日常办公中&#xff0c;我们常常需要将PDF文件转换成Word文件&#xff0c;以便于编辑和修改。然而有时候在PDF转Word的过程中可能会遇到乱码的问题&#xff0c;让人感到困扰。在面对这种情况时&#xff0c;我们需要选择正确的方法&#xff0c;避免文件转换后出现乱码。下面我…

面积阵列封装技术-BGA CSP/Flip Chip

面积阵列封装有不同的类型&#xff0c;因此也就有着不 同的结构特点和组装方式。面积阵列封装以其结构 形 式 可 分 为 两 大 类 :BGA/CSP 和 倒 装 芯 片&#xff08;Flip Chip&#xff09;。 1 BGA技术 BGA 形式封装是 1980 年由富士通公司提出&#xff0c; 在日本 IBM 公司…

Excel处理数据的常用函数整理

1.常用函数 2.常见数学和三角函数 excel求逆矩阵的例子&#xff1a; 3.统计函数

图像滤波器

图像噪声 • 图像噪声是图像在获取或是传输过程中受到随机信号干扰&#xff0c;妨碍人们对图像理解及分析处理 的信号。 • 图像噪声的产生来自图像获取中的环境条件和传感元器件自身的质量&#xff0c;图像在传输过程中产 生图像噪声的主要因素是所用的传输信道受到了噪声…

mysql用is null查不生效的一种情况

今天发现了一个诡异的情况&#xff1a; 首先是在记录中可以明显看到 update_time有null记录。 但用一下sql查询&#xff1a; SELECT count(*) FROM risknoting WHERE noting_state未标注 and update_time is NULL得到结果却是0条。 但应该无论如何都要大于等于1条。 因此&am…

互联网医院系统|互联网医院软件开发|互联网医院搭建方案

随着互联网技术的发展&#xff0c;互联网医院系统逐渐成为医疗服务的新模式&#xff0c;为患者和医生提供了更加方便和高效的医疗体验。下面将介绍互联网医院系统的功能优势。   在线挂号和预约&#xff1a;互联网医院系统可以提供在线挂号和预约功能&#xff0c;患者可以通过…

Mysql关于进程中的死锁和解除锁

Mysql 经常会遇到语句或者存储过程长时间没有反应&#xff0c;大概率就是挂掉了&#xff0c;或者死锁了。 可通过如下几种方式来查看当前进程状态 1. 查询数据库所有的进程状态 SHOW PROCESSLIST SELECT * FROM information_schema.PROCESSLIST; 2. 查询在锁的事务 SELECT…

Unity TMP (TextMeshPro) 创建字体材质

1 TMP 简介 完整名称&#xff1a;Text Mesh Pro &#xff0c;unity新一代主流字体插件 1.1 组件变化 内置的Text组件以及与内置Text组件绑定的Button、DropDown、InputField均被替换为使用TextMeshPro的版本 内置的Text组件以及与内置Text组件绑定的Button、DropDown、Input…

Python基于PyTorch实现循环神经网络分类模型(LSTM分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 LSTM网络是目前更加通用的循环神经网络结构&#xff0c;全称为Long Short-Term Memory&#xff0c;翻…

事业单位-语言理解1】逻辑填空-词的辨析04

事业单位-语言理解1】逻辑填空04 一、词的辨析1.1词义侧重瞻前顾后 三、程度轻重四、感情色彩五&#xff0c;今日词义搭配 一、词的辨析 2022年联考常见词汇 1.1词义侧重 推脱&#xff0c;推托&#xff0c;可以把拆开&#xff0c;单单看脱和托的区别。 注意前后的主语和宾…

性能测试请求重试实现思路

文章目录 一、背景二、尝试的解决方案三、解决方案1&#xff1a;jmeter retrier插件&#xff01;有点用但是不是特别有用-_-||四&#xff0c;最终解决方案&#xff1a;lucust! 一、背景 最近系统需要压测一些活动&#xff0c;场景是新建抽奖活动之后&#xff0c;每隔2s查询1次…

Java 稀疏数组

实际需求&#xff08;应用场景&#xff09; 稀疏数组基本介绍 上面表格的第一行中的6、7、8 表示左边的二维数组一共有 6 行 7 列&#xff0c;在数组中有 8 个不同的值&#xff0c;分别是22、15、 11、17、 -6、 39、 91、 28. 表格的其他行表示每个值所在的行列信息&#xff0…

斯坦福开源FlashAttention,大模型速度翻倍

一年时间&#xff0c;斯坦福大学提出的新型 Attention 算法 ——FlashAttention 完成了进化。这次在算法、并行化和工作分区等方面都有了显著改进&#xff0c;对大模型的适用性也更强了。 近来&#xff0c;几种长上下文语言模型陆续问世&#xff0c;包括 GPT-4&#xff08;上下…

【C#性能】C# 语言中的数组迭代

一、说明 可迭代性&#xff0c;是数组等操作的根本&#xff1b;在C程序开发过程中&#xff0c;可迭代操作是非常普遍、非常广泛的&#xff0c;然而&#xff0c;对这种操作知道多少&#xff0c;又不知道多少&#xff0c;都将影响开发灵活性、开发的进度。因此&#xff0c;本文干…

vs2013 编译wxwidgets界面库

首先进入官网下载&#xff0c;本人再git上下载的基本都编译失败 https://www.wxwidgets.org/ 在网站里面找最新的就可以&#xff0c;下载之后放在一个目录&#xff0c;找到vs的目录 然后找到wx_vc12.sln&#xff0c;打开编译即可 Debug、Release编译出来的是静态库 DLL Deb…

P1149火柴棒等式题解

P1149[NOIP2008 提高组] 火柴棒等式 题目描述 给你 n n n 根火柴棍&#xff0c;你可以拼出多少个形如 A B C ABC ABC 的等式&#xff1f;等式中的 A A A、 B B B、 C C C 是用火柴棍拼出的整数&#xff08;若该数非零&#xff0c;则最高位不能是 0 0 0&#xff09;。用…

华南理工大学电信学院信号与系统实验1~4(杨俊美老师)

博客中仅放了题目&#xff0c;源码在下方链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1TpRAiNltybYWimETKHFKWA?pwd88ux 提取码&#xff1a;88ux --来自百度网盘超级会员V4的分享 有可能实验的序号可能编错码或者放错文件夹&#xff08;因为老师给的时候很多…

题目4 命令执行(保姆级教程)

url&#xff1a;http://192.168.154.253:84/ #打开http://XXX:81/&#xff0c;XXX为靶机的ip地址 审题 1、打开题目看到有一个提示&#xff0c;此题目需要通过利用命令执行漏洞执行Linux命令获取webshell&#xff0c;最后从根目录下key.php文件中获得flag 2、开始答题 第一步&…