【leetcode】152. 乘积最大子数组

题目内容

152. 乘积最大子数组

思路分析

方法一:动态规划

本题与53. 最大子序和类似,但是本题是乘法运算,因此nums[i]的最大乘积不一定依赖于前一个数字(如[-1, 2, -3, 4])。因此需要利用以下关系来进行动态规划:

  • 当前最大值 = max(上一个数的最大值*当前数, 上一个数的最小值*当前数, 当前数)
  • 当前最小值 = min(上一个数的最大值*当前数, 上一个数的最小值*当前数, 当前数)

代码

#include <vector>
#include <math.h>
#include <limits.h>

using namespace std;

// 动态规划
// 时间复杂度O(n)
// 空间复杂度O(1)
class Solution {
public:
    int maxProduct(vector<int>& nums) {
       int n = nums.size();
       if (n == 0) return 0;

       int last_max_product{ nums[0] }, last_min_product{ nums[0] };
       int max_product = last_max_product;
       int min_product = last_min_product;
       int max_product_all = max_product;

       for (int i = 1; i < n; ++i) {
          max_product = max(max(last_max_product * nums[i], 
            last_min_product * nums[i]), nums[i]);
          min_product = min(min(last_max_product * nums[i], 
            last_min_product * nums[i]), nums[i]);
          last_max_product = max_product;
          last_min_product = min_product;
          max_product_all = max(max_product_all, max_product);
       }

       return max_product_all;
    }
};

int main() {
   Solution s;
   vector<int> input{ -2,0,-1 };
   int result = s.maxProduct(input);
   int a = 0;
}

收获

  • 感觉自己对于已经掌握的方法应用还不是很灵活。