环状数组最大子数组求和

设计思想:

    首先解决一个前后不连接数组,之后在重复循环从第二到最后再到第一,以此类推到所有可能性;求最大子数组和是要先赋予一个MAX值与是否加后面的一个数进行比较,大则重新赋值;反之则停止加和。

    如果前后数全为负数,则直接找出数组中最大数即可。

写程序中出现的问题:

   要求在O(n)的情况下进行求和,必须分析清晰,之后数组连续如果连续出现负数正数会影响思考。

源代码:

package ceshi;
 
import java.util.*;
 
public class shi {
    public static int Max(int a,int b){
        if(a<b)return b;
        else return a;
    }
    public static int zumax(int a[],int n){
        int Max=0;
        boolean p=false;
        for(int i=0;i<n;i++){
            if(a[i]>=0){
                p=true;
                break;
            }
        }  
        if(p==false){
            Max=a[0];
            for(int i=0;i<n;i++){
                if(a[i]>Max){
                    Max=a[i];
                }
            }
        }
        else{
        int i;
        int C=0;
        for(i=0;i<n;i++){
            C+=a[i];
            if(C>Max){
                Max=C;
            }
            if(C<0){
                C=0;
            }
        }
        }
        return Max;
    }
    public static int huan(int a[],int n){
        int b[]=new int[(2*n)];
        int Max2=0;
        boolean p=false;
        for(int y=0;y<n;y++){
            if(a[y]>=0){
                p=true;
                break;
            }
        }  
        if(p==false){
            Max2=a[0];
            for(int y=0;y<n;y++){
                if(a[y]>Max2){
                    Max2=a[y];
                }
            }
        }
        else{
        for(int i=0;i<n;i++){
            b[i]=a[i];
            b[i+n]=a[i];
        }
        int c[]=new int[n];
        for(int i=0;i<n;i++){
            for(int y=0;y<n;y++){
                c[y]=b[i+y];
            }
            if(Max2<zumax(c,n)){
                Max2=zumax(c,n);
            }
        }
        }
        return Max2;
    }
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        System.out.println("输入数组内数量:");
        int nn=input.nextInt();
        int aa[]=new int[nn];
        System.out.println("输入数:");
        for(int i=0;i<nn;i++){
            aa[i]=input.nextInt();
        }
        System.out.println("环状数组最大子数组为"+huan(aa,nn));
    }
}

输出结果:

总结:

这次写程序更多的是在思路上的困难,感觉到了以后写代码不只是单单的码词,一个简单正确的思路能够剩下不少时间,这个代码最主要是在环状数组它在重新“切开”之后就个 刚开始的时候不一样,需要重新求最大子数组之和。还有就是O(n)的限定,让代码不能老是for套着for结构,需要理清思路,一次成功。

原文地址:https://www.cnblogs.com/bai123/p/6652720.html