枚举系列 最大乘积 java版

本文介绍了一种解决最大连续子序列乘积问题的方法。通过枚举起点和终点来找到乘积最大的连续子序列,适用于元素数量不超过18且每个元素绝对值不大于10的情况。

今儿个又看一题 意为:
输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正整,应输出-1(表示无解)。1≤n≤18,-10≤Si≤10。
样例输入:
3
2 4 -3
5
2 5 -1 2 -1
样例输出:
8
20


这道题也是一道纯纯的枚举习题
我们先做一下分析
连续子序列有两个要素:起点和终点,
因此只需要枚举起点和终点即可。
由于每个元素的绝对值不超过10,一共又不超过18个元素,最大可能的乘积示会超过1028,
可以用long 存下。


核心代码:

long ans = 0; // 存放最大的乘积
for (int i = 0; i < n; i++) {
//从序列中的第0个元素开始,枚举最大连续乘积,并用ans存储
    long temp = 1;
    for (int j = i; j < n; j++) {
        temp *= a[j];
        if (temp > ans)
            ans = temp;
    }
}

整体代码:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        int[] a = new int[20]; // 存放输入序列的每一个元素
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) { // 输入序列中元素的个数n
            int n = sc.nextInt();// 输入元素的个数
            for (int i= 0; i < n; i++) // 输入序列中的元素
                a[i] =  sc.nextInt();
            long ans = 0; // 存放最大的乘积
            for (int i = 0; i < n; i++) {
                //从序列中的第0个元素开始,枚举最大连续乘积,并用ans存储
                long temp = 1;
                for (int j = i; j < n; j++) {
                    temp *= a[j];
                    if (temp > ans)
                        ans = temp;
                }
            }
            if (ans > 0)
                System.out.printf("%d\n", ans);

            else
                System.out.printf("%d\n", -1);
        }
    }
}

运行结果:
这里写图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹏AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值