数组中累加和为定值K的最长子数组长度

本文探讨如何找到数组中累加和为给定值K的最长子数组长度。对于正数数组,使用滑动窗口法,通过移动左右边界调整子数组和。对于包含正负数和0的数组,借助HashMap存储子数组和及其结束位置,以找到满足条件的最长子数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1、给定一个数组,值全是正数,请返回累加和为给定值k的最长子数组长度。

方法一:暴力求解,求出所有的子数组,共n*(n-1)/2个,然后对每个子数组求和,时间复杂度为O(n^3)

改进方法:因为数组值全是整数,所以长度为n的子数组和一定大于长度为n-1的子数组和(不管多的一项在子数组左边还是右边)。所以可以利用滑动窗口的思想来求解。调整窗口的长度及左右边界使其内的子数组和为k,求出最大窗口长度即可。

例如数组arr的下标为:0...left...right...n-1

left、right分别为滑动窗口的左右边界。

分析:

情况一:当sum[left...right]==k ,此时窗口的长度为最长,再扩展窗口必然会sum>k,记录更新窗口的长度len,并把左边界右移left++减小窗口长度;

情况二当sum[left...right]<k,增加窗口长度,右边界右移right++;

情况三当sum[left...right]>k,没有满足条件,减小窗口长度,左边界右移left++

注意:窗口大小改变时,不要忘记更新sum的值。

时间复杂度:因为只设置了左右两个指针变量,判断

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值