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 };

浙公网安备 33010602011771号