本科非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
第二版参考了这个人的博客做了如下修正,其实这边不是数据结构的问题,而是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 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 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 maxSum){
maxSum = thisSum;
}else if(thisSum < 0 ){
thisSum = 0;
}
}
return maxSum;
}
}
下次专门找个时间把分治的算法再搞一遍。