九度OJ平台练习 —— 题目1011

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了九度OJ平台练习 —— 题目1011相关的知识,希望对你有一定的参考价值。

技术分享

这道题是求最大子序列和,这是很经典的算法题,网络上有很多资料,我用的是动态规划的方法,时间复杂度为O(N)。

假设序列的长度为n,那么和最大的连续子序列,只能以第0~第n-1中的某一个数结尾。

当遍历到第i个元素时,假设它前面的连续子序列和为maxhere。

如果maxhere>0,maxhere = maxhere + 第i个元素;

如果maxhere<=0,maxhere = 第i个元素(因为如果前面的连续子序列是负的,那我加上你反而变小了,那我还不如不加,就以我自己为子序列的起点,重新往后找)

Java代码如下:

import java.util.*;
public class Main{
    public static void main(String args[]){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            int n = in.nextInt();
            if(n == 0)break;
            int buf[] = new int[n];
            for(int i = 0; i < n; i++)
                buf[i] = in.nextInt();
            int max,maxhere;
            int start,end;
            max = maxhere = buf[0];
            start = end = 0;
            int temp = 0;
            boolean flag = false;
            for(int i = 1; i < n; i++){
                if(buf[i] >= 0) flag = true;
                if(maxhere <= 0){
                    maxhere = buf[i];
                    temp = i;//temp是连续子序列的起始位置
                }
                else
                    maxhere += buf[i];
          //当发现了和更大的连续子序列时,用start记录连续子序列的起始位置,用end记录末尾位置
if(maxhere > max){ max = maxhere; start = temp; end = i; } } if(flag || n == 1){ System.out.println(max+" "+buf[start]+" "+buf[end]); } else{ System.out.println("0 "+buf[0]+" "+buf[n-1]); } } in.close(); } }

 

以上是关于九度OJ平台练习 —— 题目1011的主要内容,如果未能解决你的问题,请参考以下文章

九度OJ平台练习 —— 题目1012

九度oj 题目1397:查找数段

九度OJ-题目1009:二叉搜索树

九度oj 题目1465:最简真分数

九度oj 题目1460:Oil Deposit

九度oj 题目1014:排名