Leetcode152——Maximum Product Subarray
2131 ワード
作者:Tyan博客:noahsnail.com | CSDN |
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4], the contiguous subarray [2,3] has the largest product = 6.
この問題はLeetcode 53--Maximum Subarayと似ていて、三重サイクル、二つのサイクルで解決できます.しかし,動的計画で解決し,状態遷移方程式を見つけることが最も重要である.積は負であり、負は正である可能性があるため、
最大値配列と最小値配列が定義されていません
最大値配列と最小値配列の定義
1.問題の説明
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4], the contiguous subarray [2,3] has the largest product = 6.
2.解を求める
この問題はLeetcode 53--Maximum Subarayと似ていて、三重サイクル、二つのサイクルで解決できます.しかし,動的計画で解決し,状態遷移方程式を見つけることが最も重要である.積は負であり、負は正である可能性があるため、
i-1
回目の積最大値(maxValue Pre)と最小値(minValue Pre)の両方を保持する必要がある.もちろん、最大値最小値配列を定義して、i回目の積の最大値(maxValue)と最小値(minValue)を保存することもできます.Maximum Subarayと比較して、最大値はmaxValue = max(minValuePre * nums[i], maxValuePre * nums[i], nums[i])
であり、最小値も同様である.最大値配列と最小値配列が定義されていません
public class Solution {
public int maxProduct(int[] nums) {
int n = nums.length;
int maxValue = nums[0];
int minValue = nums[0];
int result = nums[0];
int maxValuePre = nums[0], minValuePre = nums[0];
for(int i = 1; i < n; i++) {
maxValue = Math.max(minValuePre * nums[i], Math.max(maxValuePre * nums[i], nums[i]));
minValue = Math.min(minValuePre * nums[i], Math.min(maxValuePre * nums[i], nums[i]));
if(maxValue > result) {
result = maxValue;
}
maxValuePre = maxValue;
minValuePre = minValue;
}
return result;
}
}
最大値配列と最小値配列の定義
public class Solution {
public int maxProduct(int[] nums) {
int n = nums.length;
int maxValue[] = new int[nums.length];
int minValue[] = new int[nums.length];
maxValue[0] = nums[0];
minValue[0] = nums[0];
int result = nums[0];
for(int i = 1; i < n; i++) {
maxValue[i] = Math.max(minValue[i - 1] * nums[i], Math.max(maxValue[i - 1] * nums[i], nums[i]));
minValue[i] = Math.min(minValue[i - 1] * nums[i], Math.min(maxValue[i - 1] * nums[i], nums[i]));
if(maxValue[i] > result) {
result = maxValue[i];
}
}
return result;
}
}