列表

详情


152. 乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

测试用例的答案是一个 32-位 整数。

子数组 是数组的连续子序列。

 

示例 1:

输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

输入: nums = [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

 

提示:

相似题目

最大子数组和

打家劫舍

除自身以外数组的乘积

三个数的最大乘积

乘积小于 K 的子数组

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int maxProduct(vector<int>& nums) { } };

java 解法, 执行用时: 1 ms, 内存消耗: 42.2 MB, 提交时间: 2023-09-16 11:01:46

class Solution {
    public int maxProduct(int[] nums) {
        int max = Integer.MIN_VALUE, imax = 1, imin = 1;
        for(int i=0; i<nums.length; i++){
            if(nums[i] < 0){ 
              int tmp = imax;
              imax = imin;
              imin = tmp;
            }
            imax = Math.max(imax*nums[i], nums[i]);
            imin = Math.min(imin*nums[i], nums[i]);
            
            max = Math.max(max, imax);
        }
        return max;
    }
}

rust 解法, 执行用时: 0 ms, 内存消耗: 2.1 MB, 提交时间: 2023-09-16 11:01:26

impl Solution {
    pub fn max_product(nums: Vec<i32>) -> i32 {
        let mut ans = i32::MIN;
        let (mut max, mut min) = (1, 1);
        for n in nums {
            if n < 0 {
                std::mem::swap(&mut max, &mut min);
            }
            max = n.max(max * n);
            min = n.min(min * n);
            ans = ans.max(max);
        }
        ans
    }

    pub fn max_product2(nums: Vec<i32>) -> i32 {
        let (mut max, mut min, mut res) = (nums[0], nums[0], nums[0]);
        for num in nums.into_iter().skip(1) {
            let max_ = max;
            max = num.max(num * max).max(num * min);
            min = num.min(num * max_).min(num * min);
            res = res.max(max);
        }
        res
    }
}

python3 解法, 执行用时: 56 ms, 内存消耗: 16.6 MB, 提交时间: 2023-09-16 10:58:25

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        ans = float('-inf')
        imax, imin = 1, 1
        for num in nums:
            if num < 0:
                imax, imin = imin, imax

            imax = max(imax * num, num)
            imin = min(imin * num, num)
            ans = max(ans, imax)
    
        return ans

golang 解法, 执行用时: 4 ms, 内存消耗: 2.6 MB, 提交时间: 2021-07-21 10:05:42

func maxProduct(nums []int) int {
	ans := math.MinInt64
	imax, imin := 1, 1
	for _, num := range nums {
		if num < 0 {
			imax, imin = imin, imax
		}
		imax = max(imax * num, num)
		imin = min(imin * num, num)
		ans = max(ans, imax)
	}

	return ans
}

// 较大值
func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

// 较小值
func min(x, y int) int {
	if x > y {
		return y
	}
	return x
}

golang 解法, 执行用时: 4 ms, 内存消耗: 2.6 MB, 提交时间: 2021-05-31 11:00:30

func maxProduct(nums []int) int {
	ans := math.MinInt64
	imax, imin := 1, 1
	for _, num := range nums {
		if num < 0 {
			imax, imin = imin, imax
		}
		imax = getMax(imax * num, num)
		imin = getMin(imin * num, num)
		ans = getMax(ans, imax)
	}

	return ans
}

func getMax(x, y int) int {
	if x > y {
		return x
	}
	return y
}

func getMin(x, y int) int {
	if x > y {
		return y
	}
	return x
}

上一题