Description:
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.
Solution:
其实最近一直在学习+刷题,只不过懒得跟新博客,有些题目比较琐屑,AC了就完事。
但是今天这个题目挺有意思的,这种解题模式不好理解,我也是之前dq的题目做了一些才比较快理解。
这种题目的核心思路是如何拆解。此类题目的数据可以中断(比如碰到0,前后就隔断了),所以思路就是碰到第 i 个Number的时候,有三种行为:只用它本身(这就能实现数据隔断);它乘以前一位的最大值;它乘以前一位的最小值(负负得正,可能比乘以最大值还大)。
之所以要乘以负数,是因为它现在虽然很小,但是当碰到下一个负数的时候,可能就翻身变成最大了。
这种题目模式和一些dp的模式在于如何确认第 i 个元素的行为模式。这很很很很抽象,需要用脑子debug和多做题来找感觉~
用信条的一句话:不要试着理解他,去感受他
public int maxProduct(int[] nums) {
if (nums.length == 0 || nums == null)
return -1;
int final_result = nums[0], cur_max = nums[0], cur_min = nums[0];
for (int i = 1; i < nums.length; ++i) {
int temp = cur_max;
temp = Math.max(nums[i], Math.max(nums[i] * cur_max, nums[i] * cur_min));
cur_min = Math.min(nums[i], Math.min(nums[i] * cur_max, nums[i] * cur_min));
cur_max = temp;
if (cur_max > final_result) {
final_result = cur_max;
}
}
return final_result;
}