求最大子数组和

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;


public class MaxSubArray {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        Scanner in=new Scanner(System.in);
        int n;
        System.out.println("输入数组元素个数");
        n=in.nextInt();
        int []array=new int[n];
        System.out.println("输入数组元素");
        for(int i=0;i<n;i++)
        {
            array[i]=in.nextInt();
        }
        int []doubleArray=new int[2*n];
        for(int i=0;i<n;i++)
        {
            doubleArray[i]=array[i];
        }
        for(int j=0;j<n;j++)
        {
            doubleArray[j+n]=array[j];
        }
        //验证doubleArray在排列上是否为array数组*2
        /*for(int m=0;m<2*n;m++)
        {
            System.out.print(doubleArray[m]);
        }*/
        
        //列举所有子数组和
        System.out.println("子数组的和为:");
        File file=new File("max.txt");
        FileWriter fw=new FileWriter(file);
        int max=0;
        for(int i=0;i<n;i++)
        {
            int flag=0;
            for(int j=i;j<2*n;j++)
            {
                
                max=max+doubleArray[j];
                flag++;
                System.out.print(max+" ");
                fw.write(max+"\n");//所有子数组的和写入max文件
                if(flag==n)//达到数组最大长度跳出循环
                    break;
            }
            max=0;//归零
            System.out.println();
        }
        fw.close();
        System.out.println();
        //读取max文件子数组和并获取最大值
        FileReader fr=new FileReader("max.txt");
        BufferedReader br=new BufferedReader(fr);
        int[]GetMax=new int[n*n];
        String line;
        int j = 0;
        while((line=br.readLine())!=null)
        {
            GetMax[j++]=Integer.parseInt(line);    
        }
        br.close();
        int SubMax=GetMax[0];
        for(int i=0;i<n*n;i++)
        {
            if(GetMax[i]>SubMax)
                SubMax=GetMax[i];
        }
        System.out.println("子数组和最大值为"+SubMax);
    }

}

输入一个一维整形数组,里面有整数也有负数

一位数组首尾相接,像一条首尾相接的带子

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和

求所有子数组的和的最大值

 

 

运行结果截图

将数组中的元素安春旭一次向后累加,同事如果遇到负数那么一定会变小,将其写入保存,读出其中和的最大值

posted @ 2017-03-31 18:50  解昊兴  阅读(146)  评论(0)    收藏  举报