最大子数组II

来源:互联网 发布:网络工作 编辑:程序博客网 时间:2024/06/05 16:39
 给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
 注意事项
子数组最少包含一个数
样例
给出数组 [1, 3, -1, 2, -1, 2]

这两个子数组分别为 [1, 3] 和 [2, -1, 2] 或者 [1, 3, -1, 2] 和 [2],它们的最大和都是 7

import java.util.ArrayList;import java.util.Scanner;/** * 给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大。每个子数组的数字在数组中的位置应该是连续的。返回最大的和。 注意事项子数组最少包含一个数样例给出数组 [1, 3, -1, 2, -1, 2]这两个子数组分别为 [1, 3] 和 [2, -1, 2] 或者 [1, 3, -1, 2] 和 [2],它们的最大和都是 7 *  * @author Dell * */public class Test42 {   public static int maxTwoSubArrays(ArrayList<Integer> nums)   {    if(nums==null||nums.size()<2)     return 0;     int left[]=new int[nums.size()];         int right[]=new int[nums.size()];         int result=Integer.MIN_VALUE;         int sum1=0;         int sum2=0;         int max1=Integer.MIN_VALUE;         int max2=Integer.MIN_VALUE;   for(int i=0;i<nums.size();i++)   {   sum1=sum1+nums.get(i);   if(sum1>max1)   {   max1=sum1;    }   left[i]=max1;   if(sum1<0)   sum1=0;      }   for(int i=nums.size()-1;i>=0;i--)   {   sum2=sum2+nums.get(i);   if(sum2>max2)   {   max2=sum2;   }   right[i]=max2;   if(sum2<0)   sum2=0;      }  for(int i=0;i<nums.size()-1;i++)  {  if(left[i]+right[i+1]>result)  {  result=left[i]+right[i+1];  }  } return result;     }public static void main(String[] args) {     Scanner sc=new Scanner(System.in);     int n=sc.nextInt();    ArrayList<Integer> list=new ArrayList<>();     for(int i=0;i<n;i++)     {    list.add(sc.nextInt());     }     System.out.println(maxTwoSubArrays(list));     }}


原创粉丝点击