Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 750|回复: 0

[算法学习]最大子段和及构成(java)

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-12-6 00:07:10 | 显示全部楼层 |阅读模式
    给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a+a[i+1]+…+a[j]的子段和的最大值。
    当所给的整数均为负数时定义子段和为0,依此定义,所求的最大值为:

    Max{0,a+a[i+1]+…+a[j]},1<=i<=j<=n
    例如,当(a1,a2,a3,a4,a4,a6)=(-2,11,-4,13,-5,-2)时,最大子段和为20.

    1. import java.util.Scanner;
    2. public class MaxSequence{

    3.    public static   int[] findMaxSequence(int n, int[] seq){
    4.     /* seq为传入的整型数组,n为数组长度, start, end分别用来返回所找到的最长子串的起始下标和截止下标 */
    5.           int maxsofar = 0;
    6.           int maxendinghere = 0;
    7.           int starthere = 0;
    8.           int start=0;
    9.           int end= 0;
    10.           for ( int i = 0; i < n; i++ )
    11.           {
    12.                if ( maxendinghere + seq[i] >= 0 )
    13.                     maxendinghere = maxendinghere + seq[i];
    14.                else
    15.                {
    16.                    maxendinghere = 0;
    17.                    starthere = i+1;
    18.                }
    19.                if ( maxendinghere > maxsofar ||((maxendinghere == maxsofar) && (end - start) < (i - starthere)))
    20.                {
    21.                   maxsofar = maxendinghere;
    22.                   start = starthere;
    23.                   end = i;
    24.                }
    25.            }
    26.            return new int[]{start,end,maxsofar};
    27.       }
    28.      
    29. public static void main(String[] args) {
    30.   /**
    31.    *从键盘输入所要求的序列的长度n
    32.    */
    33.   Scanner in=new Scanner(System.in);
    34.   int n=in.nextInt();
    35.   
    36.   /**
    37.    *从键盘输入所要求的数组,存储在a[n]中
    38.    */
    39.   int[] a=new int[n];
    40.   for(int i=0;i< n;i++) {
    41.    a[i]=in.nextInt();
    42.   }
    43.    int result[]=findMaxSequence(n,a);
    44.    System.out.println("最大子段和是:"+result[2]);
    45.    System.out.println("最大子段和构成:");
    46.    for(int i=result[0];i<=result[1];i++)
    47.       System.out.print(a[i]+"  ");
    48.   }
    49. }
    50.   
    51. C:        est>java   MaxSequence
    52. 15
    53. 1 2 -1 1 3 2 -2 3 -1 5 -7 3 2 -2 -1
    54. 最大子段和是:13
    55. 最大子段和构成:
    56. 1  2  -1  1  3  2  -2  3  -1  5
    57. C:        est>java   MaxSequence
    58. 6
    59. -2 11 -4 13 -5 -2
    60. 最大子段和是:20
    61. 最大子段和构成:
    62. 11  -4  13
    复制代码
      


    源码下载:http://file.javaxxz.com/2014/12/6/000710343.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 04:28 , Processed in 0.338668 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表