有感而發
本科非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;
}
}
下次專門找個時間把分治的算法再搞一遍。