leetcode 152 乘积最大子数组

一道很有纪念意义的动态规划题目。动态规划的核心在于找到最优子结构,自己写的动态规划中,使用了近乎暴力的计算方法,用一个二维数组去存储乘积。固然可以,但是和动态规划的内核是不符的。所以需要在遍历的过程中维护当前节点之前的最大乘积和最小乘积,同时维护两个是因为当前节点值可能为负数,所以乘上最小乘积有可能产生最大值,并且在当前节点值,当前节点值乘上最大,最小值这三个数中选择最大与最小值。完成遍历之后,最大值数组中的最大值即为结果,贴代码。

 1 class Solution {
 2 public:
 3     int maxProduct(vector<int>& nums) 
 4     {
 5         int n = nums.size();
 6         vector<int> maxTemp(nums),minTemp(nums);
 7         for(int i = 1 ; i < n ; i++)
 8         {
 9             maxTemp[i] = max(nums[i],max(nums[i]*maxTemp[i-1],nums[i]*minTemp[i-1]));
10             minTemp[i] = min(nums[i],min(nums[i]*maxTemp[i-1],nums[i]*minTemp[i-1]));
11         }
12         return *max_element(maxTemp.begin(),maxTemp.end());
13     }
14 };

 

posted @ 2021-09-25 19:41  zhaohhhh  阅读(40)  评论(0)    收藏  举报