152. Max subarray product

static int max(int a, int b) { return a > b ? a : b; }
static int min(int a, int b) { return a < b ? a : b; }

int maxProduct(int *nums, int numsSize) {
  int curMax = nums[0], curMin = nums[0], best = nums[0];

  for (int i = 1; i < numsSize; i++) {
    int x = nums[i];
    int a = curMax * x, b = curMin * x;

    curMax = max(x, max(a, b));
    curMin = min(x, min(a, b));
    best = max(best, curMax);
  }
  return best;
}
#include <algorithm>
#include <vector>

using namespace std;

class Solution {
public:
  int maxProduct(vector<int> &nums) {
    int curMax = nums[0], curMin = nums[0], best = nums[0];

    for (int i = 1; i < (int)nums.size(); i++) {
      int x = nums[i];
      int a = curMax * x, b = curMin * x;

      curMax = max({x, a, b});
      curMin = min({x, a, b});
      best = max(best, curMax);
    }
    return best;
  }
};
package dp

func maxProduct(nums []int) int {
    curMax, curMin, best := nums[0], nums[0], nums[0]

    for _, x := range nums[1:] {
        a, b := curMax*x, curMin*x

        curMax = max(x, a, b)
        curMin = min(x, a, b)
        best = max(best, curMax)
    }
    return best
}
class Solution {
    public int maxProduct(int[] nums) {
        int curMax = nums[0], curMin = nums[0], best = nums[0];

        for (int i = 1; i < nums.length; i++) {
            int x = nums[i];
            int a = curMax * x, b = curMin * x;

            curMax = Math.max(x, Math.max(a, b));
            curMin = Math.min(x, Math.min(a, b));
            best = Math.max(best, curMax);
        }
        return best;
    }
}
/**
 * @param {number[]} nums
 * @return {number}
 */
var maxProduct = function (nums) {
  let curMax = nums[0], curMin = nums[0], best = nums[0];

  for (let i = 1; i < nums.length; i++) {
    const x = nums[i];
    const a = curMax * x, b = curMin * x;

    curMax = Math.max(x, a, b);
    curMin = Math.min(x, a, b);
    best = Math.max(best, curMax);
  }
  return best;
};
from typing import List


class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        cur_max = cur_min = best = nums[0]

        for x in nums[1:]:
            a, b = cur_max * x, cur_min * x

            cur_max = max(x, a, b)
            cur_min = min(x, a, b)
            best = max(best, cur_max)
        return best
impl Solution {
    pub fn max_product(nums: Vec<i32>) -> i32 {
        let (mut cur_max, mut cur_min, mut best) = (nums[0], nums[0], nums[0]);

        for &x in &nums[1..] {
            let (a, b) = (cur_max * x, cur_min * x);

            cur_max = x.max(a).max(b);
            cur_min = x.min(a).min(b);
            best = best.max(cur_max);
        }
        best
    }
}