zoukankan      html  css  js  c++  java
  • 题目:返回一个整数数组中最大子数组的和。

     


    要求:
    (1)输入一个整形数组,数组里有正数也有负数。
    (2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    (3)如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
    (4)同时返回最大子数组的位置。
    (5)求所有子数组的和的最大值。要求时间复杂度为O(n)。
    一、设计思想 
    这个问题的最优解一定是以下两种可能。
    可能一:最优解没有跨过array[n-1]到array[0],即和非环形数组一样了。
    可能二:最优解跨过array[n-1]到array[0],新问题。
    对于第一种情况,我们可以按照非环形数组求法来求,为max1;对于第二种情况,可以将原问题转化为数组的最小子数组和问题,再用数组全部元素的和减去最小子数组和,那么结果一定是跨过a[n-1]到a[0]情况中最大的子数组和,设为max2。最终结果即为max1与max2中较大的那个。
    例1:有数组5、-1、-6、8、2
    求得max1=10,max2=15,则取较大的max2作为结果。
    例2:有数组-6、8、1、6、-1
    求得max1=15,max2=14,则取较大的max1作为结果。

    二、源程序

    package com.minirisoft;

    import java.util.*;

    public class MaxArray {

        public static void main(String[] args)

        {

            int o1=0;

            int num,i;

            int sum=0;

            int max;

            int first=0;

            int last=0;

            int order=0;

            Scanner cin=new Scanner(System.in);

            System.out.print("请输入数组的长度:");

            num=cin.nextInt();

            int array[]=new int[num];

            int max1=array[0];

            int min=array[0];

            for(i=0;i<num;i++)

            {

                array[i]=cin.nextInt();

            }

            for(i=0;i<num;i++)

            {

                 if(sum<=0)

                 {

                     sum=array[i];

                     first=i;

                 }

                 else

                 {

                     sum=sum+array[i];

                 }

                 if(sum>max1)

                 {

                     max1=sum;

                     last=i;

                 }

            }

            System.out.println("第一种情况的最大值:"+max1);

            for(i=0;i<num;i++)

            {

                 if(sum>=0)

                 {

                     sum=array[i];

                     o1=i;

                 }

                 else

                 {

                     sum=sum+array[i];

                  

                 }

                 if(sum<min)

                 {

                     min=sum;

                     order=i;

                 }

            }

            int sum1=0;

            for(i=0;i<num;i++)

            {

                sum1=sum1+array[i];

            }

            int max2=sum1-min;

            System.out.println("第二种情况的最大值:"+max2);

            if(max1>max2)

            {

                System.out.println("和最大子数组为:");

                max=max1;

                for(int j=first;j<=last;j++){

                    System.out.println(array[j]+" ");

                }

            }

            else

            {

                max=max2;

                System.out.println("和最大子数组为:");

                for(int j=0;j<num;j++){   

                    if(j<o1||j>order){

                        System.out.println(array[j]+" ");

                    }

                    /*if(j!=order)

                    {

                        System.out.print(array[j]+" ");

                    }*/

                }

            }

           

            System.out.println("子数组和的最大值为:"+max);

           

        }

    }

    三、运行结果截图:

  • 相关阅读:
    HDU 4738——Caocao's Bridges——————【求割边/桥的最小权值】
    POJ 3177——Redundant Paths——————【加边形成边双连通图】
    亲历:IT 从业者避免猝死攻略 v1.0
    Linux如何统计进程的CPU利用率
    gcp – 源于CP的高级命令行文件拷贝工具
    丰田栽了的原因,嵌入式软件工程师都该看看
    四件在我步入职业软件开发生涯那天起就该知道的事情
    浅谈自底向上的Shell脚本编程及效率优化
    实用硬件产品集锦
    [置顶] openHAB 体系结构与编程模型 (1) --- 术语
  • 原文地址:https://www.cnblogs.com/zhaochenguang/p/8299483.html
Copyright © 2011-2022 走看看