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;
    }
}

 

下次專門找個時間把分治的算法再搞一遍。

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