动态规划,不过与和最大子序列不同,原因是乘积有正负,因而在动规数组中不能只记录最大值,还需要记录最小值,如:nums = [1,0,-1,2,3,-5,-2]
,如果只用一个动规数组,dp=[1,1,1,2,6,6,6]
,即nums[3]与nums[4]
的积,显然是不正确的,因为nums[3]*nums[4]*nums[5]*nums[6]=60
。为了解决这一问题,我们需要再增加一个动规数组,用来记录乘积最小值,防止由于”负负得正“引起的正负值的问题。
Python
class Solution:
# @param nums: an integer[]
# @return: an integer
def maxProduct(self, nums):
# write your code here
if len(nums) == 0:
return 0
max_ans = [nums[0] for i in range(len(nums))]
min_ans = [nums[0] for i in range(len(nums))]
for i in range(1, len(nums)):
max_ans[i] = max(max_ans[i-1]*nums[i], min_ans[i-1]*nums[i], nums[i])
min_ans[i] = min(max_ans[i-1]*nums[i], min_ans[i-1]*nums[i], nums[i])
return max(max_ans)
Java
public class Solution {
/**
* @param nums: an array of integers
* @return: an integer
*/
public int maxProduct(int[] nums) {
if(nums.length == 0){
return 0;
}
int[] maxAns = new int[nums.length];
int[] minAns = new int[nums.length];
maxAns[0] = nums[0];
minAns[0] = nums[0];
for(int i=1; i<nums.length; i++){
maxAns[i] = max(maxAns[i-1]*nums[i], minAns[i-1]*nums[i], nums[i]);
minAns[i] = min(maxAns[i-1]*nums[i], minAns[i-1]*nums[i], nums[i]);
}
return max(maxAns);
}
private static int max(int[] List) {
int maxNum = List[0];
for(int i=0; i<List.length; i++){
if(List[i] > maxNum){
maxNum = List[i];
}
}
return maxNum;
}
private static int max(int m, int n, int k) {
int maxNum = m > n? m:n;
maxNum = maxNum > k? maxNum: k;
return maxNum;
}
private static int min(int m, int n, int k){
int minNum = m < n? m : n;
minNum = minNum < k? minNum: k;
return minNum;
}
}