1. 程式人生 > >acm-1003 求一個數組中連續區間和的最大值問題

acm-1003 求一個數組中連續區間和的最大值問題

時間複雜度為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; } } }