最大子序和 LeetCode-53
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大子数组(不是最大值)。
输入:[-2,1,-3,4,-1,2,1,10,-1]
输出:[4,-1,2,1,10]
分析:相较于输出子序列最大和,本题需要使用两个指针记录当前和值的开始start和终止end的下标值,将最大和值的下标值存放在maxStart和maxEnd中。
public class Test {
public static void main(String[] args){
int[] num = new int[]{-2,1,-3,4,-1,2,1,10,-1};
int[] res = maxSubArray(num);
for(int i=0;i<res.length;i++){
System.out.print(res[i] + " ");
}
}
public static int[] maxSubArray(int[] nums) {
int[] dp = new int[nums.length];
dp[0] = nums[0];
int max = nums[0];
int start = 0;
int end = 0;
int maxStart = 0;
int maxEnd = 0;
for(int i=1;i<nums.length;i++){
if(dp[i-1]<0){
dp[i] = nums[i];
start = i;
}
else{
dp[i] = dp[i-1] + nums[i];
}
end++;
if(dp[i]>max){
max = dp[i];
maxStart = start;
maxEnd = end;
}
}
return Arrays.copyOfRange(nums, maxStart, maxEnd+1);
}
}