zoukankan      html  css  js  c++  java
  • 一维数组头尾相连求最大子数组

    题目:

        返回一个整数数组中最大子数组的和。

    要求:

        输入一个整形数组,数组里有正数也有负数。

        数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。 同时返回最大子数组的位置。

        求所有子数组的和的最大值。要求时间复杂度为O(n)。

    1. 设计思想:

        因为已经写过了一维数组的求最大子数组程序。所以只是在原程序上进行修改。首先产生随机数数组,然后进行计算,因为要求时间复杂度为O(n),我采用的是经这个一维数组重复一次。赋给另一个数组,长度是原数组的两倍。然后计算其中最大子数组,在此需要注意的是,如果不加限制条件,求出的最大子数组可能会超过原数组的长度。我用了一个限制条件,一旦长度等于原长度,就跳出循环,

    2. 遇到的问题及解决方法

        这个程序上大体没有什么问题,但是经过多次测试,发现其中存在一些BUG。比如两个最大值一样,并且长度及位置都不一样。或者数组只有一个负数,其他全是正数。这几个问题都有待解决,因为没有解决方法,所以暂时先到这里。后续解决方法会在仔细考虑。

    3. 源代码

        

    import java.util.Random;
    import java.util.Scanner;
    
    
    public class huan {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int a[]=new int[10000];
            int b[]=new int[20000];
            int sum,d,temp1=0,temp2=0,flag1=0,flag2=0;  //分别记录子数列的起始和结束位置
            System.out.print("请输入数组元素的个数: ");
            Scanner sc=new Scanner(System.in);
            int m=sc.nextInt();
            if(m>999999)
            {
                System.out.print("请重新输入数组元素的个数: ");
                m=sc.nextInt();
            }
            Random rand = new Random();
            for(int i=0;i<m;i++)//循环为数组赋值
            {
                a[i] = rand.nextInt(40)-20;
                b[i] = a[i];
                b[i+m]=a[i];
                System.out.print(a[i]+" ");
            }
            sum=b[0];
            d=sum;
            for(int i=0;i<2*m;i++)//核心循环,来判断怎么产生最大子数组
            {
                if(d<=0){
                    d=0;
                    temp1=i+1;
                    temp2=i;
                }        
                d+=b[i+1];
                temp2++;
                if(d>sum){
                    sum=d;
                    flag1=temp1;
                    flag2=temp2;
                    if((flag2-flag1+1)>=m)
                    {
                        break;
                    }
                }
            }
            System.out.println("");
            System.out.print("子数组的组成元素为:    ");
            for(int i=flag1;i<=flag2;i++)
                System.out.print(b[i]+" ");
            System.out.println("");
            System.out.println("子数组和的最大值为:    "+sum);
        }
    
    }

    4. 测试结果截图

        

    5. 总结

        觉得自己的能力真的很差,需要提高,一个简简单单的程序连BUG都解决不了。我一定要努力解决这些问题。通过这几次程序也学到一些东西,比如同样的一个问题加入一些不同的条件,就会有不同的方案。这给了我很大的启发,在编程中,我们要善于发散思维,因为日后很有可能会遇上这些问题。

    6. 小组照片

            

  • 相关阅读:
    服务器实现跨域
    quartz定时任务cron表达式详解
    mysql分区/分片
    微信小程序 之三元运算符代替wx:if 来解决背景图片显示隐藏
    微信小程序 本地缓存保持登录状态之wx.setStorageSync()使用技巧
    微信小程序 赋值问题
    微信小程序 wx.navigateTo()传参及多个参数方法
    js 循环遍历数组
    VUE之Router命令行警告:Named Route 'Home' has a default child route. 解决办法
    VUE之命令行报错:Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead 解决办法
  • 原文地址:https://www.cnblogs.com/zchenjian/p/4423427.html
Copyright © 2011-2022 走看看