两个问题的关键处理都在于nums[i]<0的情况。
乘积:只有一个元素nums[i]<0小于零,最大乘积是i之前或者之后;如果有多个元素小于零,就出现了负负为正的情况
和:nums[i]<0 但是如果前子序列+nums[i]小于零 ,那么 i 前后才是和最大的可能;如果大于零,可能最大和在 i之后,也可能之前
连续子序列乘积最大
class Solution {
public int maxProduct(int[] nums) {
int global=nums[0];
int maxTemp=nums[0];
int minTemp=nums[0];
for(int i=1;i<nums.length;i++){
int max=Math.max(maxTemp*nums[i],minTemp*nums[i]);
int min=Math.min(maxTemp*nums[i],minTemp*nums[i]);
maxTemp=Math.max(nums[i],max);
minTemp=Math.min(nums[i],min);
global=Math.max(maxTemp,global);
}
return global;
}
}
连续子序列和最大
public int sumProduct(int[] nums) {
int max=nums[0];
int cur=0;
for(int i=0;i<nums.length;i++){
if(cur<0)
cur=0;
cur+=nums[i];
max=Math.max(max,cur);
}
return max;
}
博客聚焦于连续子序列乘积最大和连续子序列和最大两个问题,关键处理在于nums[i]<0的情况。对于乘积,一个或多个元素小于零有不同处理方式;对于和,根据前子序列加nums[i]与零的大小关系判断最大和位置。
457

被折叠的 条评论
为什么被折叠?



