Leetcode::maximum product subarray

Problem Description

How to solve

Big O (Time, Space)

Code

MySolution - two pointer between zeros

class Solution {
public:
    long long maxProduct(vector<int>& nums, int st, int en) {
        if (st + 1 == en) return 0;

        long long ret = -1e8;
        int negCnt = 0;
        for (int i = st + 1; i < en; i++) {
            if (nums[i] < 0) negCnt++;
        }
        if (negCnt % 2 == 0) {
            ret = 1;
            for(int i = st + 1; i < en; i++) ret *= nums[i];
        } else {
            int cnt = 0, le = st + 1;
            long long curr = 1;
            for(int ri = st + 1; ri < en; ri++) {
                curr *= nums[ri];
                ret = max(ret, curr);
                if (nums[ri] < 0) cnt++;
                while (cnt == negCnt && le <= ri) {
                    if (nums[le] < 0) cnt--;
                    curr /= nums[le++];
                }
                if (le < ri)
                    ret = max(ret, curr);
            }
        }
        return ret;
    }
    int maxProduct(vector<int>& nums) {
        long long ans = -1e8;
        for(auto x : nums) ans = max((int)ans, x);

         vector<int> zeros;
         if (nums[0] != 0) nums.insert(nums.begin(), 0);
         if (nums.back() != 0) nums.push_back(0);
         for(int i = 0; i < nums.size(); i++) if (nums[i] == 0) zeros.push_back(i);


         for(int i = 0; i < zeros.size() - 1; i++) {
            ans = max(ans, maxProduct(nums, zeros[i], zeros[i+1]));
         }
         return ans;
    }
};

EditSolution - easyDP

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int mx = nums[0];
        int mn = nums[0];
        int ret = mx;

        for(int i = 1; i < nums.size(); i++) {
            auto num = nums[i];
            int temp_mx = mx;
            mx = max({num,      mx * num, mn * num});
            mn = min({num, temp_mx * num, mn * num});
            ret = max(ret, mx);
        }
        return ret;
    }
};