最大乘积

问题描述:输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。

  样例输入

    3
    2 4 -3

  输出 8
    5
    2 5 -1 2 -1

  输出 20
    7
    -2 4 0 3 5 8 -1
  输出 120

解题关键:因为要求连续,所以当最大值小于当前值时,立刻开启新的子串!用数组保存分别到达数组每一个值时对应的最大值和最小值!

import java.util.Scanner;
/**
 * 最大乘积
 * @author NEU-2015
 *
 */
public class Demo {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        long[] max;     
        long[] min;
        int count;
        int[] array;
        long result;
        while(input.hasNext()) {
            count = input.nextInt();
            array = new int[count];
            max = new long[count];
            min = new long[count];
            for(int i = 0; i < count; i++) {
                array[i] = input.nextInt();
            }
            max[0] = array[0];
            min[0] = array[0];
            for(int i = 1; i < count; i++) {
                max[i] = Max(max[i-1]*array[i], min[i-1]*array[i], array[i]);
                min[i] = Min(max[i-1]*array[i], min[i-1]*array[i], array[i]);
            }
            result = max[0];
            for(int i = 1; i < count; i++) {
                if(max[i] > result) {
                    result = max[i];
                }
            }
            System.out.println(result);
        }
        input.close();
    }

    private static long Max(long l, long m, int i) {
        long max = l;
        if(m > max) {
            max = m;
        }
        if(i > max) {
            max = i;
        }
        return max;
    }

    private static long Min(long l, long m, int i) {
        long min = l;
        if(m < min) {
            min = m;
        }
        if(i < min) {
            min = i;
        }
        return min;
    }
}

 

posted on 2017-10-03 10:01  NEU-2015  阅读(229)  评论(0编辑  收藏  举报

导航