zoukankan      html  css  js  c++  java
  • LeetCode OJ:Maximum Product Subarray(子数组最大乘积)

    Find the contiguous subarray within an array (containing at least one number) which has the largest product.

    For example, given the array [2,3,-2,4],
    the contiguous subarray [2,3] has the largest product = 6.

    很显然是一个动态规划的问题,找到递归表达式就可以了,考虑到会有负负相乘的问题,所以应该维持一个最大的值以及一个最小的值,递归表达式如下所示:

    1 maxLocal[i + 1] = max(max(maxLocal[i] * nums[i + 1], minLocal[i] * nums[i + 1]), nums[i + 1]);
    2 minLocal[i + 1] = min(min(maxLocal[i] * nums[i + 1], minLocal[i] * nums[i + 1]), nums[i + 1]);
    3 maxGlobal[i + 1] = max(maxGlobal[i], maxLocal[i + 1]);

    代码如下所示:

     1 class Solution {
     2 public:
     3     int maxProduct(vector<int>& nums) {
     4         int sz = nums.size();
     5         if (sz == 0)return 0;
     6         if (sz == 1)return nums[0];
     7         int maxP, minP, a, b, ret;
     8         ret = maxP = minP = a = b = nums[0];
     9         for (int i = 1; i < sz; ++i){
    10             a = max(maxP * nums[i], minP * nums[i]);
    11             b = min(maxP * nums[i], minP * nums[i]);
    12             maxP = max(a, nums[i]);
    13             minP = min(b, nums[i]);
    14             ret = max(maxP, ret);
    15         }
    16         return ret;
    17     }
    18 
    19 };

     java版本的如下所示,注意使用两个中间变量的原因是防止maxVal先直接更新了之后又被minVal所误用:

     1 public class Solution {
     2     public int maxProduct(int[] nums) {
     3         int maxVal, minVal, ret, tmpMax, tmpMin;
     4         maxVal = minVal = ret = tmpMax = tmpMin = nums[0];
     5         for(int i = 1; i < nums.length; ++i){
     6             tmpMax = Math.max(maxVal * nums[i], minVal * nums[i]);
     7             tmpMin = Math.min(maxVal * nums[i], minVal * nums[i]);
     8             maxVal = Math.max(tmpMax, nums[i]);
     9             minVal = Math.min(tmpMin, nums[i]);
    10             ret = Math.max(maxVal, ret);
    11         }
    12         return ret;
    13     }
    14 }
  • 相关阅读:
    基于2.0 创建旧模板项目
    vue 脚手架 图形化界面操作
    webpack 相关配置 (1)
    ES6模块化 babel
    处理时间函数
    问题集-- SQL 约束名不能重复
    SQL 必知必会-- 第17课:创建和操作表
    SQL 必知必会-- 第1课:数据库基础和什么是SQL
    Java SE ---类,方法,对象等
    Java SE ---控制流程:break与continue语句
  • 原文地址:https://www.cnblogs.com/-wang-cheng/p/4887258.html
Copyright © 2011-2022 走看看