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

       给定一串数组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)。

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页