博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
题目:返回一个整数数组中最大子数组的和。
阅读量:5051 次
发布时间:2019-06-12

本文共 1724 字,大约阅读时间需要 5 分钟。

 

要求:
(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]+"\t");

            }

        }

        else

        {

            max=max2;

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

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

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

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

                }

                /*if(j!=order)

                {

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

                }*/

            }

        }

       

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

       

    }

 

}

 

 

三、运行结果截图:

 

转载于:https://www.cnblogs.com/zhaochenguang/p/8299483.html

你可能感兴趣的文章
学习python:day1
查看>>
css3动画属性
查看>>
第九次团队作业-测试报告与用户使用手册
查看>>
Equal Sides Of An Array
查看>>
CentOS笔记-用户和用户组管理
查看>>
Mongodb 基本命令
查看>>
Qt中QTableView中加入Check列实现
查看>>
“富豪相亲大会”究竟迷失了什么?
查看>>
控制文件的备份与恢复
查看>>
返回代码hdu 2054 A==B?
查看>>
Flink独立集群1
查看>>
iOS 8 地图
查看>>
20165235 第八周课下补做
查看>>
[leetcode] 1. Two Sum
查看>>
iOS 日常工作之常用宏定义大全
查看>>
PHP的SQL注入技术实现以及预防措施
查看>>
MVC Razor
查看>>
软件目录结构规范
查看>>
Windbg调试Sql Server 进程
查看>>
linux调度器系列
查看>>