zoukankan      html  css  js  c++  java
  • [算法]LeetCode 152:乘积最大子序列

    题目描述:

    给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

    示例 1:

    输入: [2,3,-2,4]
    输出: 6
    解释: 子数组 [2,3] 有最大乘积 6。
    示例 2:

    输入: [-2,0,-1]
    输出: 0
    解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/maximum-product-subarray
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题目思路:

    还是动态规划的问题。

    设置dp[nums.length][2]

    dp[i][0]表示必须包含第i个数值,前面这一段区间的乘积最大值。

    dp[i][1]表示必须包含第i个数值,前面这一段区间的乘积最小值。

    状态转移方程:

    dp[i][0] = Math.max(Math.max(dp[i - 1][0] * nums[i], dp[i - 1][1] * nums[i]), nums[i]);

    dp[i][1] = Math.min(Math.min(dp[i - 1][0] * nums[i], dp[i - 1][1] * nums[i]), nums[i]);

    题目代码:

    public int maxProduct(int[] nums) {
            int[][] dp = new int[nums.length][2];
            dp[0][0] = nums[0];//最大值
            dp[0][1] = nums[0];//最小值
            int max = nums[0];
    
            for (int i = 1; i < nums.length; i++) {
                dp[i][0] = Math.max(Math.max(dp[i - 1][0] * nums[i], dp[i - 1][1] * nums[i]), nums[i]);
                dp[i][1] = Math.min(Math.min(dp[i - 1][0] * nums[i], dp[i - 1][1] * nums[i]), nums[i]);
                if(dp[i][0] > max) {
                    max = dp[i][0];
                }
            }
            return max;
        }

    这代码还可以进一步优化,使得空间复杂度更小,因为每次值依赖上一次的结果,所以数组的行数只设为2即可。

    public int maxProduct(int[] nums) {
            int[][] dp = new int[2][2];
            dp[0][0] = nums[0];//最大值
            dp[0][1] = nums[0];//最小值
            int max = nums[0];
    
            for (int i = 1; i < nums.length; i++) {
                dp[i % 2][0] = Math.max(Math.max(dp[(i - 1) % 2][0] * nums[i], dp[(i - 1) % 2][1] * nums[i]), nums[i]);
                dp[i % 2][1] = Math.min(Math.min(dp[(i - 1) % 2][0] * nums[i], dp[(i - 1) % 2][1] * nums[i]), nums[i]);
                if(dp[i % 2][0] > max) {
                    max = dp[i % 2][0];
                }
            }
            return max;
        }
  • 相关阅读:
    shell编程基础(六): 透彻解析查找命令find
    shell编程基础(五): 正则表达式及其使用
    shell编程基础(三): 位置参数与shell脚本的输入输出
    shell编程基础(二): shell脚本语法之分支语句和循环语句
    shell编程基础(一): 基本变量和基本符号
    SpringCloud学习(一):微服务简介
    ubuntu 安装bazel
    numpy reshape resize用法
    L0、L1及L2范数
    linux常用的搜索命令
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/11076948.html
Copyright © 2011-2022 走看看