import java.util.*;
public class Solution {
public int[] FindGreatestSumOfSubArray (int[] array) {
// write code here
// 题目要求返回长度最长的一个,则需要使用left、right记录子数组的起始
// 需要更新最大值的时候(要么子数组和最大,要么子数组和相等下区间要更长)顺便更新最终的区间收尾,这样来维护子数组的长度是最长的
int[] dp = new int[array.length];
dp[0] = array[0];
int maxsum = dp[0];
// 滑动区间
int left = 0, right = 0;
// 记录最长的区间
int resl = 0, resr = 0;
for(int i = 1;i<array.length;i++){
right++;
// 用dp数组表示以下标i为终点的最大连续子数组和,则每次遇到一个新的数组元素,连续的子数组要么加上变得更大,要么它本身就更大
dp[i] = Math.max(dp[i-1]+array[i],array[i]);
// 区间新起点
if(dp[i - 1] + array[i] < array[i]){
left = right;
}
// 更新最大值
if(dp[i] > maxsum || dp[i] == maxsum && (right - left + 1) > (resr - resl + 1)){
maxsum = dp[i];
resl = left;
resr = right;
}
}
int[] res = Arrays.copyOfRange(array,resl,resr+1);
return res;
}
}