【力扣hot100题】(087)乘积最大子数组
感觉题目越来越难,这题不看答案真的想不到一点。
一开始绕了不少弯路,甚至想将每一个子数组的积全部求出来比较……
答案的方法有点难懂。
方法如下:维护两个数,分别是目前为止最大数和最小数,最大数一般来说是正数,最小数一般来说是负数。(只是一般,有特殊情况)
如果当前数为负数,使得最大数变负数了,或者使最小数变正数了,两者就要“交换”。
而记录两个数组的原因就是风水轮流转,最大数肯定要记录,而谁都不知道后面会不会有负数让最小数一跃升天。
所以这题需要设置两个变量,记录在必须取当前数的情况下,前面子数组乘积的最大数和最小数。
(因为每次只需要用到上一个数的最大数和最小数所以不需要用两个数组记录,两个变量就ok了。)
class Solution {
public:
int maxProduct(vector<int>& nums) {
int maxx=nums[0];
int minn=nums[0];
int result=nums[0];
for(int i=1;i<nums.size();i++){
int m=maxx;
maxx=max(nums[i],max(maxx*nums[i],minn*nums[i]));
minn=min(nums[i],min(minn*nums[i],m*nums[i]));
result=max(result,max(maxx,minn));
}
return result;
}
};