zoukankan      html  css  js  c++  java
  • 环状数组最大子数组求和

    设计思想:

        首先解决一个前后不连接数组,之后在重复循环从第二到最后再到第一,以此类推到所有可能性;求最大子数组和是要先赋予一个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结构,需要理清思路,一次成功。

  • 相关阅读:
    哪种写法更好?<script></script> vs/or <script type=”text/javasript”></script>
    JS 脚本应该放在页面哪个位置 head body foot
    List<T> ForEach break
    嵌套JSON 取出name与value
    C# 改变图片尺寸(压缩),Image Resize
    tornado
    appachebench网站压力测试
    mysql分区分表
    redis的持久化存储,RDB与AOF
    MEMCACHE的内存管理和删除策略
  • 原文地址:https://www.cnblogs.com/bai123/p/6652720.html
Copyright © 2011-2022 走看看