LeetCode152——乘积的最大子序列和

题目:

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

示例 1:

输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:

输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

思路:

需要保存临时最大值和最小值,因为最大值乘以一个正数可能构成新的最大值,而最小值乘以 负数也可能构成新的最大值。result是要求的结果,maxValue为nums[i]之前的,和nums[i]相邻的乘 积的最大值,minValue为nums[i]之前的,和nums[i]相邻的乘积的最小值。首先令result、 maxValue和minValue都为nums[0], i从nums[1]开始一直到结束,tempMax为考虑是否选择之前的 maxValue与nums[i]相乘,如果相乘结果更大就保留,否则就选择nums[i]本身为⼤大。tempMin同理,然后maxValue和minValue比较tempMax*tempMin与minValue * nums[i]的⼤大⼩小关系, maxValue取最大值,minValue取最小值,而esult是取所有maxValue中的最大值。后返回result 

代码:

class Solution {
public:
	int maxProduct(vector<int>& nums) {
		if (nums.size() == 0)
			return 0;

		int min_value = nums[0], max_value = nums[0], result= nums[0];
		for (int i = 1; i < nums.size(); i++)
		{
			int tempMax = max(nums[i], max_value*nums[i]);
			int tempMin = min(nums[i], max_value*nums[i]);

			max_value = max(tempMax, min_value*nums[i]);
			min_value = min(tempMin, min_value*nums[i]);
			result = max(max_value, result);
		};
		return result;
	}
};
发布了269 篇原创文章 · 获赞 3 · 访问量 8427

猜你喜欢

转载自blog.csdn.net/Xiao2018428/article/details/104815239