class Solution {
public:
int maxProduct(vector<int>& nums) {
}
};
152. 乘积最大子数组
给你一个整数数组 nums
,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
子数组 是数组的连续子序列。
示例 1:
输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: nums = [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
提示:
1 <= nums.length <= 2 * 104
-10 <= nums[i] <= 10
nums
的任何前缀或后缀的乘积都 保证 是一个 32-位 整数原站题解
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 }