【LeetCode】152. Maximum Product Subarray 乘积最大子数组(Medium)(JAVA)
题目地址: https://leetcode.com/problems/maximum-product-subarray/
题目描述:
Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which has the largest product.
Example 1:
Input: [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.
Example 2:
Input: [-2,0,-1]
Output: 0
Explanation: The result cannot be 2, because [-2,-1] is not a subarray.
题目大意
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
解题方法
暴力解法
- 用两个 for 循环得到所有结果的最大值
- note: 竟然可以通过
class Solution {
public int maxProduct(int[] nums) {
if (nums.length <= 0) return 0;
int max = nums[0];
for (int i = 0; i < nums.length; i++) {
int cur = 1;
for (int j = i; j >= 0; j--) {
cur *= nums[j];
if (cur > max) max = cur;
}
}
return max;
}
}
执行耗时:107 ms,击败了7.59% 的Java用户
内存消耗:38 MB,击败了97.13% 的Java用户
O(n) 算法
- 用一个当前的最大值和当前的最小值来表示
- 如果 nums[i] >= 0: 当前的最大值 max = Math.max(nums[i], max * nums[i]); 最小值 min = Math.min(nums[i], min * nums[i]);如果 nums[i] < 0, 只需要把 max 和 min 交换就行
class Solution {
public int maxProduct(int[] nums) {
if (nums.length <= 0) return 0;
int res = Integer.MIN_VALUE;
int max = 1;
int min = 1;
for (int i = 0; i < nums.length; i++) {
if (nums[i] < 0) {
int temp = max;
max = min;
min = temp;
}
max = Math.max(nums[i], max * nums[i]);
min = Math.min(nums[i], min * nums[i]);
res = Math.max(res, max);
}
return res;
}
}
执行耗时:2 ms,击败了88.90% 的Java用户
内存消耗:37.9 MB,击败了98.38% 的Java用户
![](https://img-blog.csdnimg.cn/20201107174624800.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2OTI3ODUz,size_16,color_FFFFFF,t_70#pic_center)