一 子数组最大和
题目:求子数组最大和
3 -2 1 -6 3 2 -1 3
方式及原理
用cur记录累加和,累加和为负数的话就清零,否则一直加下去,同时每次用result于cur比较,记录cur出现过的最大值。例如上面的例子cur更新和result更新结果如下:
cur:
3 1 2 0 3 5 4 7
result
3 3 3 3 3 5 5 7
最后返回result即可。
原理解释:假设最大和子数组为T,那么他前缀肯定不为负(如果为负那么去掉它就可以找到比他大的了),如果前缀不为负当然希望它一直加下去。
二 子数组最大累计和进阶版一
题目 :求一个数组任意俩个不重叠的子数组的累加和的最大值
3 -2 1 -6 4 3 -2 3
L 3 3 3 3 4 7 7 8
R 8 8 8 8 8 4 3 3
方式及原理
是求出从左到右每个位置的左半部能取到的子数组的最大值,然后再求出从右到左每个位置右半部能取到的子数组的最大值,而这俩个不重叠的子数组肯定是以每一个位置为分割的,每个位置上述俩者和最大的即为所求的结果。
实际只要先用一个数组记录从右到左的子数组的最大值即可,从左到右的我们本来就要遍历一次,不需要多遍历一次。
三 子数组最大累计和进阶版二
题目:求未排序数组中累加和为给定值K的最长子数组系列问题(时间复杂度O(n))
2 3 1 1 1 1 1 3 2
方式及原理
设立left,right俩个指针,初始位置都在最左边的位置,然后计算俩个指针之间的数字的和tem_sum,如果tem_sum<=K,right指针++,如果tem_sum>K,left指针++,并且如果在tem_sum ==k时,计算left到right的长度并跟新到man_len保存即可。
原理是因为假设存在这么一个最长的和为定值k的子序列,我这么做肯定不会错过它,首先是right指针会逐渐到达这个存在了的子序列的右边,然后left也会慢慢过来,自己体会哈哈~