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;
        
    }
}