标签:Plan result log style xpl sum from could rom
Given an integer array nums
, find the contiguous subarray within an array (containing at least one number) which has the largest product.
Example 1:
Input: [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.
Example 2:
Input: [-2,0,-1] Output: 0 Explanation: The result cannot be 2, because [-2,-1] is not a subarray.
Idea 1. How can we extend a solution from nums[0..i] to nums[0..i+1]? what shall we do for a newly added element nums[i+1]. Similar to Maximum Subarray LT53, assume we know the largest product for array nums[0..i],
if nums[i+1] >= 0, maxProduct(i+1) = Math.max(maxProduct(i) * nums[i+1], nums[i+1])
if nums[i+1] < 0, to get the max product ending at (i+1), we also need to know the min element ending at i which could be negative, maxProduct(i+1) = Math.max(minProduct(i) * nums[i+1], nums[i+1]).
For any element at i+1, maxProduct(i+1) = Math.max( nums[i+1], minProduct(i) * nums[i+1], maxProduct(i) * nums[i+1] )
Time complexity: O(n)
Space complexity: O(1)
1 class Solution { 2 public int maxProduct(int[] nums) { 3 int minHere = 1, maxHere = 1, result = Integer.MIN_VALUE; 4 5 for(int num: nums) { 6 int res1 = minHere * num; 7 int res2 = maxHere * num; 8 if(res1 < res2) { 9 minHere = Math.min(res1, num); 10 maxHere = Math.max(res2, num); 11 } 12 else { 13 minHere = Math.min(res2, num); 14 maxHere = Math.max(res1, num); 15 } 16 result = Math.max(result, maxHere); 17 } 18 return result; 19 } 20 }
1 class Solution { 2 public int maxProduct(int[] nums) { 3 int minHere = 1, maxHere = 1, result = Integer.MIN_VALUE; 4 5 for(int num: nums) { 6 int res1 = minHere * num; 7 int res2 = maxHere * num; 8 9 minHere = Math.min(Math.min(res1, res2), num); 10 maxHere = Math.max(Math.max(res1, res2), num); 11 12 result = Math.max(result, maxHere); 13 } 14 return result; 15 } 16 }
Maximum Product Subarray LT152
标签:Plan result log style xpl sum from could rom
原文地址:https://www.cnblogs.com/taste-it-own-it-love-it/p/10425208.html