可以采用动态规划算法,但这里需要注意的一点就是会存在负负得正得场景。所以要求当遍历到时,要记录下前面的最小和最大值,因为nums[i]可能为正也可能为负。
package likou;
/*
* 乘积最大子数组
* 题干:
* 给你一个整数数组 nums
* 请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字)
* 并返回该子数组所对应的乘积
*/
public class Demo152 {
/*
* 解题思路:
* 采用动态规划算法,但这里需要注意的一点就是会存在负负得正得场景
* 所以当遍历到i时,要想乘积最大,需要保证前面的积为最大或最小(nums[i]可能为正也可能为负)
*
*/
public int maxProduct(int[] nums) {
int length = nums.length;
if (length == 1) {
return nums[0];
}
int maxValue = nums[0];// 前i个元素累积最大
int minValue = nums[0];// 前i个元素累积最小
int temp = nums[0];// 返回的最大乘积
for (int i = 1; i < nums.length; i++) {
//这里一定要定义一个局部变量
int tempMax = maxValue;
int tempMin = minValue;
maxValue = Math.max(nums[i], Math.max(tempMax * nums[i], tempMin * nums[i]));
minValue = Math.min(nums[i], Math.min(tempMax * nums[i], tempMin * nums[i]));
if (temp < maxValue) {
temp = Math.max(maxValue, minValue);
}
}
return temp;
}
public static void main(String args[]) {
Demo152 demo = new Demo152();
int[] nums = {-4,-3,-2};
System.out.println(demo.maxProduct(nums));
}
}