acm-1003 求一個數組中連續區間和的最大值問題
阿新 • • 發佈:2019-01-06
時間複雜度為n的方法:
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int max = 0, sum1 = 0, first1 = 0, end1 = 0;
int ar = 0, num = 0;
for (int i = 0; i < n; i++) {
num = sc.nextInt();
for (int j = 0; j < num; j++) {
ar = sc.nextInt();
if (sum1 < 0) {
sum1 = ar;
first1 = j;
} else {
sum1 += ar;
}
if (sum1 > max) {
max = sum1;
end1 = j;
}
}
System.out .println("Case " + (int) (i + 1) + ":");
System.out.println(max + " " + (int) (first1 + 1) + " "
+ (int) (end1 + 1));
max = 0;
sum1 = 0;
first1 = 0;
end1 = 0;
}
}
}
時間複雜度為n^2的方法:
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int sum = 0, sum1 = 0, first = 0, end = 0, first1 = 0, end1 = 0;
for (int i = 0; i < n; i++) {
int num = sc.nextInt();
int[] ar = new int[num];
for (int j = 0; j < num; j++) {
ar[j] = sc.nextInt();
}
for (int j = 0; j < num; j++) {
if (ar[j] >= 0) {
for (int k = j; k < ar.length; k++) {
sum1 += ar[k];
if (sum1 < 0)
break;
if (sum1 > sum) {
sum = sum1;
first = j;
end = k;
}
}
sum1 = 0;
}
}
System.out.println("Case " + (int) (i + 1) + ":");
System.out.println(sum + " " + (int) (first + 1) + " "
+ (int) (end + 1));
sum = 0;
first = 0;
end = 0;
}
}
}