牛客NC83 连续子数组的最大乘积【中等 动态规划 Java,Go,PHP】

文章介绍了如何使用动态规划方法解决求解给定整数数组中最大子数组乘积的问题,通过比较当前元素与之前最大积的乘积(option1)和最小积的乘积(option2)来更新最大积。给出了Java、Go和PHP三种编程语言的实现代码示例。
摘要由CSDN通过智能技术生成

题目

在这里插入图片描述

题目链接:
https://www.nowcoder.com/practice/abbec6a3779940aab2cc564b22d36859

思考

对于任意一个subarray来说,它最大的积,
有可能来自之前的最大积乘以一个正数(option1),
或者之前的最小积乘以一个负数(option2),
或者nums[i]就是最大的.

因此:
int option1 = maxSoFar * nums[i];
int option2 = minSoFar * nums[i];
maxSoFar = Math.max(nums[i], Math.max(option1, option2));
minSoFar = Math.min(nums[i], Math.min(option1, option2));

参考答案Java

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型
     */
    public int maxProduct (int[] nums) {
        //动态规划
        int n = nums.length;
        int[] dpmax = new int[n];
        int[] dpmin = new int[n];

        dpmax[0] = nums[0];
        dpmin[0] = nums[0];

        int ans = nums[0];

        for (int i = 1; i < n ; i++) {
            int p1 = nums[i];
            int p2 = dpmax[i - 1] * p1;
            int p3 = dpmin[i - 1] * p1;

            dpmax[i] = Math.max(p1, Math.max(p2, p3));
            dpmin[i] = Math.min(p1, Math.min(p2, p3));

            ans = Math.max(ans, dpmax[i]);
        }
        return ans;
    }
}

参考答案Go

package main


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @return int整型
*/
func maxProduct( nums []int ) int {
   	//动态规划
	n := len(nums)
	dpmax := make([]int, n)
	dpmin := make([]int, n)

	dpmax[0] = nums[0]
	dpmin[0] = nums[0]
	ans := nums[0]

	for i := 1; i < n; i++ {
		p1 := nums[i]
		p2 := dpmax[i-1] * p1
		p3 := dpmin[i-1] * p1

		curmax := p1
		if curmax < p2 {
			curmax = p2
		}

		if curmax < p3 {
			curmax = p3
		}

		curmin := p1
		if curmin > p2 {
			curmin = p2
		}

		if curmin > p3 {
			curmin = p3
		}

		dpmax[i] = curmax
		dpmin[i] = curmin

		if ans < curmax {
			ans = curmax
		}
	}

	return ans
}

参考答案PHP

<?php


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @return int整型
 */
function maxProduct( $nums )
{
     //动态规划
    $n = count($nums);
    $dpmax = $dpmin = [0 => $nums[0]];
    $ans = $nums[0];
    for ($i = 1; $i < $n; $i++) {
        $p1 = $nums[$i];
        $p2 = $dpmax[$i - 1] * $p1;
        $p3 = $dpmin[$i - 1] * $p1;

        $curmax = $p1;
        if ($curmax < $p2) $curmax = $p2;
        if ($curmax < $p3) $curmax = $p3;

        $curmin = $p1;
        if ($curmin > $p2) $curmin = $p2;
        if ($curmin > $p3) $curmin = $p3;

        $dpmax[$i] = $curmax;
        $dpmin[$i] = $curmin;

        if ($ans < $curmax)
            $ans = $curmax;
    }
    return $ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

赵长辉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值