1.动态规划
此处求的连续子序列。
遍历当前数组计算最大值,设为imax,则imax=max(imax*nums[i],nums[i]);
即imax表示以i节点为终点的子序列的最大值,但数组中可能存在负值,继续计算会导致最大的变成最小的,最小的变成最大的,故还需要记录以i节点为终点的子序列的最小值,imin=min(imin*nums[i],nums[i]);
当节点i+1为负数时,交换imax与imin的值,继续计算,可以保证imax仍然表示以i+1节点为终点的子序列的最大值,imin表示以i+1节点为终点的子序列的最小值。
代码如下:
class Solution {
public:
int maxProduct(vector<int>& nums) {
//连续子序列
int m=INT_MIN,imax=1,imin=1;
for(int i=0;i<nums.size();i++)
{
if(nums[i]<0)
{
int tmp=imax;
imax=imin;
imin=tmp;
}
imax=max(imax*nums[i],nums[i]);
imin=min(imin*nums[i],nums[i]);
m=max(imax,m);
}
return m;
}
};
或者写成如下情况:思路和一样,只是更加清晰
class Solution {
public:
int maxProduct(vector<int>& nums) {
//连续子序列
int n = nums.size();
if(n == 0){
return 0;
} else if(n == 1) {
return nums[0];
}
int m=INT_MIN,imax = 1,imin = 1;
for(int i = 0; i < n; i++) {
int t = imax;
imax = max(max(imax * nums[i], nums[i]), imin *nums[i]);
imin= min(min(t * nums[i], nums[i]), imin * nums[i]);
m = max(imax, m);
}
return m;
}
};
其中imax,imin求的是imax*nums[i],nums[i],imin*nums[i]的最大值,最小值,这样就解决了负数存在的情况
扫描二维码关注公众号,回复:
9870091 查看本文章