import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] FindGreatestSumOfSubArray (int[] array) {
int[] dp = new int[array.length];//当前位置子数组和的最大值
int[] len = new int[array.length];//当前位置最大子数组的长度
dp[0] = array[0];
len[0] = 1;
int max = array[0];
for (int i = 1; i < array.length; i++) {
dp[i] = Math.max(dp[i - 1] + array[i],array[i]);
if(dp[i - 1] + array[i] == array[i]){
len[i] = len[i - 1] + 1;
}else {
len[i] = dp[i] == array[i] ? 1 : len[i - 1] + 1;
}
max = Math.max(max,dp[i]);
}
int index = -1;
Queue<int[]> queue = new PriorityQueue<>(1,(x,y) -> {
return y[1] - x[1];
});
for (int i = 0; i < array.length; i++) {
if(dp[i] == max){
int[] ints = new int[2];
ints[0] = i;
ints[1] = len[i];
queue.add(ints);
}
}
index = queue.peek()[0];
int[] res = new int[len[index]];
int j = 0;
for (int i = index - len[index] + 1; i <= index; i++) {
res[j] = array[i];
j++;
}
return res;
}
}
一个dp数组存最大和,一个长度数组存最大数组长度,然后直接根据下标和长度从原数组里摘出来就行(可能有多个数组和都是最大,用优先队列排个序就行)



京公网安备 11010502036488号