LeetCode | 152. 乘积最大子序列

原题Medium):

  给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

  

 

 

思路:

  遍历数组时且逐元素相乘时,如果遇到了0,在求乘积最大值的情况下,0左边的元素与0右边的元素将不会产生任何联系,因为结果归零了。所以可以把数组看作是被0拆分的各个子数组,然后求其各个子数组的总乘积再比较。而在各个子数组内,会出现负值元素,在求子数组的最大值时分为两种情况:

  1. 如果子数组内的负值元素个数为偶数个,则整个子数组各个值直接相乘得到最大值
  2. 如果子数组内的负值元素个数为奇数个,则从左边开始遍历相乘直到最后一个奇数前为止,得到一个最大值;再从右边开始遍历相乘到第一个奇数前为止,又得到一个最大值,两值再比较取最大值。
 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 }

posted @ 2019-10-28 10:33  羽园原华  阅读(215)  评论(0编辑  收藏  举报