leetcode乘积最大子序列

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 查看本文章
发布了191 篇原创文章 · 获赞 3 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_38196982/article/details/104741914