LintCode -- maximum-product-subarray(乘积最大子序列)
原题链接:http://www.lintcode.com/zh-cn/problem/maximum-product-subarray/
找出一个序列中乘积最大的连续子序列(至少包含一个数)。
比如, 序列 [2,3,-2,4]
中乘积最大的子序列为 [2,3]
,其乘积为6
。
分析:
遍历数组,并记录 i - 1个数的时候的最大值和最小值。针对第 i 个数的正负来选择更新最大值和最小值的方法。
**** 时间复杂度 O(n), 空间复杂度 O(1) ****
代码(C++、Java、Python):
class Solution { public: /** * @param nums: a vector of integers * @return: an integer */ int min(int a, int b){ if (a < b) return a; else return b; } int max(int a, int b){ if (a > b) return a; else return b; } int maxProduct(vector<int>& nums) { // write your code here int n = nums.size(); if (n == 1) return nums[0]; int res = nums[0]; int minlist[2] = {nums[0]}; int maxlist[2] = {nums[0]}; for (int i = 1; i < n; i++){ minlist[i%2] = nums[i]; maxlist[i%2] = nums[i]; if (nums[i] > 0){ maxlist[i%2] = max(maxlist[i%2], maxlist[(i-1)%2]*nums[i]); minlist[i%2] = min(minlist[i%2], minlist[(i-1)%2]*nums[i]); } else { maxlist[i%2] = max(maxlist[i%2], minlist[(i-1)%2]*nums[i]); minlist[i%2] = min(minlist[i%2], maxlist[(i-1)%2]*nums[i]); } res = max(res, maxlist[i%2]); } return res; } };
public class Solution { /** * @param nums: an array of integers * @return: an integer */ public int maxProduct(int[] nums) { // write your code here int n = nums.length; if (n == 1) return nums[0]; int res = nums[0]; int [] minlist = new int [2]; int [] maxlist = new int [2]; for (int i = 0; i < 2; i++){ minlist[i] = nums[0]; maxlist[i] = nums[0]; } for (int i = 1; i < n; i++){ minlist[i%2] = nums[i]; maxlist[i%2] = nums[i]; if (nums[i] > 0){ maxlist[i%2] = max(maxlist[i%2], maxlist[(i-1)%2]*nums[i]); minlist[i%2] = min(minlist[i%2], minlist[(i-1)%2]*nums[i]); } else { maxlist[i%2] = max(maxlist[i%2], minlist[(i-1)%2]*nums[i]); minlist[i%2] = min(minlist[i%2], maxlist[(i-1)%2]*nums[i]); } res = max(res, maxlist[i%2]); } return res; } int min(int a, int b){ if (a < b) return a; else return b; } int max(int a, int b){ if (a > b) return a; else return b; } }
class Solution: # @param nums: an integer[] # @return: an integer def maxProduct(self, nums): # write your code here n = len(nums) if n == 1: return nums[0] res = nums[0] minlist = [nums[0] for i in range(2)] maxlist = [nums[0] for i in range(2)] for i in range(1, n): minlist[i%2] = nums[i] maxlist[i%2] = nums[i] if nums[i] > 0: maxlist[i%2] = max(maxlist[i%2], maxlist[(i-1)%2]*nums[i]) minlist[i%2] = min(minlist[i%2], minlist[(i-1)%2]*nums[i]) else: maxlist[i%2] = max(minlist[i%2], minlist[(i-1)%2]*nums[i]) minlist[i%2] = min(minlist[i%2], maxlist[(i-1)%2]*nums[i]) res = max(res, maxlist[i%2]) return res def max(a, b): if a > b: return a else: return b def min(a, b): if a < b: return a else: return b