专栏 | 九章算法程序员
网址 | http://www.jiuzhang.com面试
题目描述算法
给定一串数列,求出3个互相不覆盖的长度为k的子串,使其数字总和为最大值。输出的值为三个子串的起始下标。若是有多种解,输出字典序最小的一组微信
样例:app
输入:[1,2,1,2,6,7,5,1],2 输出:[0,3,5]优化
解题思路分析3d
首先预处理前缀和,使sum[i]表明以第i个数结尾的长度为k的子串和,方便咱们以后的计算某个区间的和。code
最朴素的方法是对三段的起始位置进行遍历,求和,时间复杂度是O(n^3)。cdn
那么如何优化呢?blog
咱们先不考虑下标,只考虑答案最大**。**若是已知前n个字符中符合题意描述“互相不覆盖的长度为k的子串”的1串最大和为sum_max,那么咱们加上当前串的值value,就组成了前n+1个串中符合题意描述的2串最大和,为sum_max+value。
所以,对于第i个位置的求和,咱们考虑从[0,i-k]的状态转移,在已知的子串和中加入新的子串,求得从起始到i位的两串最大值。同理,若是咱们从后往前作相同处理,能够获得从后往前的i位两串最大值。
换言之,能够考虑将它划分为三个区域[0,i-k] [i,i+k-1][i+k,len),咱们只须要枚举中间的sum[i],早预处理从左到当前位置的最大前缀和,从右到当前位置的最大后缀和,加起来就一定是当前位置能找到的最大和,遍历一遍就能取得最终解。
参考程序
参考程序给出的left和right分别记录从左到第i位和从右到第i位的最大sum的下标,由于题意要字典序最小,因此在更新right的时候注意符号。
http://www.jiuzhang.com/solution/maximum-sum-of-3-non-overlapping-subarrays/
面试官角度分析
本题是一道中等难度的题目,主要考察对动态规划的应用和利用预处理进行优化和节省空间,若是可以想出动态规划的解法,那此题就能够获得hire的评分。
lintcode相关问题