PTA最大子列和

有感而发

本科非cs专业,电子渣渣,自毕业后转行java web已有三年,心里总觉基础薄弱,最近良心发现开始潜心修习内功,不求最好,但求能坚持下去,先定个小目标 3个月过完一遍。

求最大子列和

这是一稿在看了视频之后在pta上进行练习的第三遍结果,尽管任然没有通过测试,但是距离对已经不远了

package org.example;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int N= in.nextInt();
        Scanner inArray = new Scanner(System.in);
        String s = inArray.nextLine();
        String[] split = s.split(" ");
        if(split.length == N){
            int num[] = new int[N];
            for (int i = 0; i < split.length; i++) {
                num[i] = Integer.parseInt(split[i]);
            }
            int i = Question.maxSubseqSum(num, N);
            System.out.println(i);

        }


    }

}
class Question{
    public static int maxSubseqSum(int a[],int N){
        int thisSum = 0,maxSum = 0;
        int i,j,k;
        for ( i = 0; i < N; i++) {
            for ( j = i; j < N; j++) {
                thisSum = 0;
                for(k = i;k<=j;k++){
                    thisSum += a[k];
                }
                if(maxSum<thisSum){
                    maxSum = thisSum;
                }
            }
        }
        return maxSum;

    }
}

第二版参考了这个人的博客做了如下修正,其实这边不是数据结构的问题,而是java基础的问题
 


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int[] array = new int[N];
        for (int i = 0; i < N; i++) {
            array[i] = in.nextInt();
        }
        System.out.println(Question.maxSubseqSum(array, N));
    }
}

class Question {
    public static int maxSubseqSum(int a[], int N) {
        int thisSum = 0, maxSum = 0;
        int i, j, k;
        for (i = 0; i < N; i++) {
            for (j = i; j < N; j++) {
                thisSum = 0;
                for (k = i; k <= j; k++) {
                    thisSum += a[k];
                }
                if (maxSum < thisSum) {
                    maxSum = thisSum;
                }
            }
        }
        return maxSum;

    }
}

我的测评结果

哎,谁让自己菜呢,终于踏上了别人犯过的错误。现在来修正

问题分析:还记得之前看过分治的思想,奈何要写的时候是不可能写的出来的,得强忍着,不骂自己是废物,坚持就好了。

下面的第三版是对代码进行小的调整使得时间复杂度从o(n3)到o(n2)。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int[] array = new int[N];
        for (int i = 0; i < N; i++) {
            array[i] = in.nextInt();
        }
        System.out.println(Question.maxSubSeqSum(array, N));
    }
}

class Question {

    public static int maxSubSeqSum(int a[],int N){
        int thisSum = 0,maxSum = a[0];
        int i,j,k;
        for(i=0;i<N;i++){
            thisSum = 0;
            for(j=i;j<N;j++){
                thisSum += a[j];
                if(thisSum > maxSum){
                    maxSum = thisSum;
                }
            }
        }
        return maxSum;
    }
}

 

 

按照以往的风格,这大概就完事了。但是咱不能一直在低水平上面游走呀,做道题就要像一道题。想个十分钟怎样从 o(n2)到o(nlogn),不行还是抄,反正从小学抄到大学,也是没谁了。

想了10分钟了。。。。手算会用分治了。。。

看了下在线算法,貌似比分治好理解,分治慢慢想吧

 

谈谈在线的算法的关键点吧

1. 来一个算一个

2. 核心是当累加到负数的时候,需要把这个数变成0

3. 为负的子列和,不可能使后面的子列和更大!

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int[] array = new int[N];
        for (int i = 0; i < N; i++) {
            array[i] = in.nextInt();
        }
        System.out.println(Question.maxSubSeqSumOnline(array, N));
    }
}

class Question {

    /**
     * o(n2)
     * @param a
     * @param N
     * @return
     */
    public static int maxSubSeqSum(int a[],int N){
        int thisSum = 0,maxSum = a[0];
        int i,j,k;
        for(i=0;i<N;i++){
            thisSum = 0;
            for(j=i;j<N;j++){
                thisSum += a[j];
                if(thisSum > maxSum){
                    maxSum = thisSum;
                }
            }
        }
        return maxSum;
    }
    public static int maxSubSeqSumOnline(int a[],int N){
        int thisSum = 0,maxSum = a[0];
        int i;
        for(i=0;i<N;i++){
            thisSum += a[i];
            if(thisSum > maxSum){
                maxSum = thisSum;
            }else if(thisSum < 0 ){
                thisSum = 0;
            }
        }
        return maxSum;
    }
}

 

下次专门找个时间把分治的算法再搞一遍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章