[Leetcode] 152. Maximum Product Subarray

来源:互联网 发布:linux free swap 编辑:程序博客网 时间:2024/06/08 18:31

题目

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.

思路

个人感觉刷题就好像是准备高考数学题一样,做的多了,就慢慢觉得有套路了。我看到题目之后就觉得似乎是DP问题。不过和一般的DP还有一点不同:因为会负负得正,正负得负,所以需要同时保存截止某一位的最大值和最小值。而最大值和最小值又和三个变量相关:上次最大值,上次最小值以及当前数。因此状态转移方程为:

dp_min[i] = min (min(dp_min[i-1] * nums[i], dp_max[i-1] * nums[i]), nums[i])

dp_max[i] = max(max(dp_min[i-1] * nums[i], dp_max[i-1] * nums[i]), nums[i]).

这里dp_min和dp_max分别记录了截止目前的局部最大值和最小值。再用一个值记录一下全局最大值,每次与局部最大值相比较,最后就可以得到最大的连续乘积。时间复杂度是O(n),空间复杂度也是O(n)。

通过观察递推式可以发现,dp_min[i]以及dp_max[i]只和dp_min[i-1]以及dp_max[i-1]有关,所以我们可以将空间复杂度进一步降低到O(1)。具体代码请见下面。

代码

class Solution {public:    int maxProduct(vector<int>& nums) {        if(nums.size() == 0) {            return 0;        }        int max_global = nums[0];        int max_local = nums[0];        int min_local = nums[0];        for(int i = 1; i < nums.size(); ++i) {            int a = nums[i] * max_local;            int b = nums[i] * min_local;            max_local = max(max(a, b), nums[i]);            min_local = min(min(a, b), nums[i]);            max_global = max(max_global, max_local);        }        return max_global;    }};

原创粉丝点击