LeetCode | 152. 乘积最大子序列
原题(Medium):
给定一个整数数组 nums
,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
思路:
遍历数组时且逐元素相乘时,如果遇到了0,在求乘积最大值的情况下,0左边的元素与0右边的元素将不会产生任何联系,因为结果归零了。所以可以把数组看作是被0拆分的各个子数组,然后求其各个子数组的总乘积再比较。而在各个子数组内,会出现负值元素,在求子数组的最大值时分为两种情况:
- 如果子数组内的负值元素个数为偶数个,则整个子数组各个值直接相乘得到最大值
- 如果子数组内的负值元素个数为奇数个,则从左边开始遍历相乘直到最后一个奇数前为止,得到一个最大值;再从右边开始遍历相乘到第一个奇数前为止,又得到一个最大值,两值再比较取最大值。
1 int maxProduct(vector<int>& nums) { 2 //获取各个子数组的总乘积 3 int product = 1; 4 //获取各个子数组总乘积中的最大的那个 5 int max = nums[0]; 6 7 //无论数组的负值元素是奇数还是偶数,都进行一次左遍历和右遍历,结果是一致的 8 9 //右遍历 10 for (int num : nums) 11 { 12 product *= num; 13 if (max<product)max = product; 14 //如果遇到0,说明数组要被拆分,0左边子数组遍历结束,开始0右边子数组的遍历,product归一,重新开始累乘 15 if (num == 0)product = 1; 16 } 17 18 //左遍历 19 product = 1; 20 for (int i = nums.size() - 1; i >= 0; i--) 21 { 22 product *= nums[i]; 23 if (max<product)max = product; 24 //如果遇到0,说明数组要被拆分,0右边子数组遍历结束,开始0左边子数组的遍历,product归一,重新开始累乘 25 if (nums[i] == 0)product = 1; 26 } 27 return max; 28 }