求一串数组中和为定值的最长子串

       给定一串数组arr,和一个值num,求和为num的最长子串。

       类似数组或者字符串的最大最小问题,往往考虑的一个方向是按照每一个下标怎么样去考虑,比如:下标为i时,以arr[i]结尾时和为num的最长子串为多少,因为最终的结果一定会以一个数组的某个数字结尾所以,所以通过这种方法最后的结果一定在其中。

       接下来来考虑一个具体问题,假如此时要求和为14的最长子串,我在以arr[20]结尾的时候,下标0到20的和为35,那么如果我能确定0下标到多少下标的和为35-14=21(此处假设0到4位置的和为21),那么可以确定5到20这一部分的和一定为14。因为我们要求的是最长的子串,那么我们找的一定是第一次出现和为21的位置,打个比方0到4位置和为21,0到7位置和也未21,那么8到20位置的和也为14,但是显然它比5到20位置要短。

       所以至此,该问题编写流程出来了:

       1、遍历一遍数组,求出对应位置的和;

       2、用一张map,其中key为和,value值为和对应的下标,(注意:map更新时要查询,如果这个和已经存在,因为我们顺序遍历数组,说明先插入map的和位置一定考前,此时不用更新map)

       3、再次遍历数组,这次求每个位置的sum,然后再在map中查询sum-num的值,如果存在,说明以当前位置结尾存在和为num的子串,可以得到一个起始位置和终止位置,然后比较是否比上一次的结果长,长的话就更新,否则不更新。

        至此问题得解,时间复杂度O(n)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值