最大子数组和

 

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+"
");//所有子数组的和写入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);
    }

}

设计思路:

DoubleArray数组等于两个Array数组,相当于将Array数组弄成一个掰直的头尾相连的数组。按Array中元素顺序开始向后累加DoubleArray数组的元素,直到达到Array的长度n,生成所有子数组的和。再把这些和写入文件max,用GetMax数组读取max文件中的这些和,最后筛选出最大值,即为最大子数组和。

运行结果截图:

原文地址:https://www.cnblogs.com/clueless/p/6649632.html