给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
class Solution {
public int maxProduct(int[] nums) {
int res = nums[0];
int imax = nums[0];
int imin = nums[0];
for(int i=1; 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]);
res = Math.max(res, imax);
}
return res;
}
}
运行结果
思路:imax和imin记录每个数组元素相乘的最大最小值,res与每次计算的最大值比较,保留每次计算的最大值。
每次遇到负数交换最大值和最小值,第一次遇到负数,交换最大值最小值,是因为负数与小的正数乘大,与大的正数相乘小;第二次遇到负数交换是因为现在的最大最小值都为负数,与下面的负数相乘,与小的负数相乘获得大的正数,与大的负数相乘获得小的正数。
class Solution {
public int maxProduct(int[] nums) {
int res = Integer.MIN_VALUE;
//边界条件
if (nums == null || nums.length == 0) {
return 0;
}
if (nums.length == 1) {
return nums[0];
}
for (int i = 0; i < nums.length; i++) {
int max = nums[i];
if (max > res) {
res = max;
}
for (int j = i + 1; j < nums.length; j++) {
max = max * nums[j];
if (max > res) {
res = max;
}
}
}
return res;
}
}
运行结果
思路:该方法使用两个for循环,找出每次便利计算出的最大数。