思路::使用两个变量代替动态规划辅助数组,记录到下标i为止的最大连续子数组和,下标为0的时候,初始第一个变量为数组第一个元素。准备左右区间双指针记录每次连续子数组的首尾,再准备两个双指针记录最大和且区间最长的连续子数组的首尾。遍历数组,对于每个元素用上述状态转移公式记录dp值,并轮转两个变量,更新区间首尾(如果需要)。出现一个最大值。且区间长度更大的时候,更新记录最长区间的双指针。根据记录的最长子数组的位置取数组。
代码实现:
public class Solution {
public int[] FindGreatestSumOfSubArray (int[] array) {
int x = array[0];
int y = 0;
int maxsum = x;
//滑动区间
int left = 0, right = 0;
//记录最长的区间
int resl = 0, resr = 0;
for(int i = 1; i < array.length; i++){
right++;
//状态转移:连续子数组和最大值
y = Math.max(x + array[i], array[i]);
//区间新起点
if(x + array[i] < array[i])
left = right;
//更新最大值
if(y > maxsum || y == maxsum && (right - left + 1) > (resr - resl + 1)){
maxsum = y;
resl = left;
resr = right;
}
//更新x的状态
x = y;
}
//取数组
int[] res = new int[resr - resl + 1];
for(int i = resl; i <= resr; i++)
res[i - resl] = array[i];
return res;
}
}