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

    ·设计思想

      (1)首先做出来的是不首尾相接的数组,求其最大数组和它的和,其主要思路是:先找到其数组和的最大值,然后再记录其取最大值的数组元素的下标。求最大值,首先,初始化变量最大值,初值设为零遍历整个数组,数组元素每加一次记录其和的结果,将其和最大值比较,大于最大值,就将和的值赋给最大值,其中,如果和值为负数,在加下一个数组元素时,记录和值的变量先要重新赋值为零,这样最后遍历完之后。最大值就求出来了。其次,记录其下标,用字符串记录下标,读取时用charAt读取第一个下标,至于最后的一个下标,则是记录当最大值发生被替换时,此时的下标,就是最后一个!最后,结尾的完善工作就好做了,把读取的start下标转化成int型,for循环将其对应下标的数组元素输出,将最大值输出

      (2)首尾相接的数组,基本思路是用两个for循环,把首尾相接的数组拆分成一个个数组,每次拆分都是一个长度为原先数组长度的数组,在每个里面找最大的子数组,将这个问题再次变成求首尾不相接的数组

    ·代码

    public class Tes {
        public static void main(String[] args)
        {
            int a[]={-3,-1,2,-3,-4,-2};
            System.out.println("最大子数组的值为:"+fun(a));
        }
        public static int fun(int[] arr) 
        {
            int he = 0;
            int max = 0;
            int len = arr.length;
            int start = 0;
            int end = 0;
            int[] begin = new int[len*2-1]; 
            int[] arrcir = new int[len*2-1];
            for(int i=0;i<len;i++)
            {
                arrcir[i] = arr[i];
            }
            
            for(int i=0;i<len-1;i++)
            {
                arrcir[len+i] = arr[i];
            }
            
            if (arr == null || len == 0) 
            {
                System.out.println("数组为空!!!");
            }
    
            for(int i=0;i<len;i++)
            {
                he = arr[i];
                if(arr[i]>=0)
                {
                    start = i;
                    for (int j = i+1; j <len+i; j++)
                    {
                        he += arrcir[j];
                        if (he < 0)
                        {
                            he = 0;
                            start = j;
                        }
                        if (he >= max) 
                        {
                            max = he;
                            end = j;
                            begin[j] = start;
                        }
                    }
                }
            }
            
            String out = "";
            System.out.println(start+" "+end);
            for(;begin[end] <= end;begin[end]++)
            {
                out = out + " "+arrcir[begin[end]];
            }
            
            if (max == 0)
            {
                for (int i = 0; i < len; i++) 
                {
                    if (i == 0)
                    {
                        max = arr[i];
                    }
                    if (arr[i] > max)
                    {
                        max = arr[i];
                        start = end = i;
                    }
                }
                out = arr[end] + "";
            }
            System.out.println("最大子数组为: "+out);
            return max;
        }
    }

    ·结果截图

     

     

  • 相关阅读:
    celery 大量消息的分布式系统 定时任务
    小程序开发-生活娱乐两不误
    linux安装selenium+chrome+phantomjs
    CENTOS 7 安装 TINYPROXY 代理服务器
    JVM(三) 垃圾回收时间点和垃圾收集器
    JDK12 concurrenthashmap源码阅读
    JVM(二) 对象存活判断和垃圾回收算法
    java 线程池(2)
    JVM(一)
    java 线程池(1)
  • 原文地址:https://www.cnblogs.com/wf1647790534/p/6642132.html
Copyright © 2011-2022 走看看