[leetcode #152] Maximum Product Subarray
2316 ワード
Problem
Given an integer array nums, find a contiguous non-empty subarray within the array that has the largest product, and return the product.
It is guaranteed that the answer will fit in a 32-bit integer.
A subarray is a contiguous subsequence of the array.
Example 1:
Input: nums = [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.
Example 2:Input: nums = [-2,0,-1]
Output: 0
Explanation: The result cannot be 2, because [-2,-1] is not a subarray.
Constraints:・ 1 <= nums.length <= 2 * 10⁴
・ -10 <= nums[i] <= 10
・ The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer.
Idea
問題は、すべての数値に最大値を乗じたサブアレイを見つけ、最大値を返すことです.
実際のサブアレイに戻る必要はなく,与えられたパラメータarrayを迂回して最大値を計算するだけでよい.
最初は値が正数か負数かを区別し、条件はこうです.しかし、他の人の解答を見て、私はこの必要が全くないことに気づいた.
まず、インデックスごとに最大値と最小値を格納するdparrayを作成します.最大値と最小値、および返される結果値をそれぞれ最初の要素値に設定します.
arrayでは、要素が正の値か負の値かに応じて、最大値と最小値を設定します.正の値の場合、最大値に要素値を乗じた値は最大値、負の値の場合は最小値に要素値を乗じた値は最小値です.毎回返される値を最大値と比較し、最大値が大きい場合は最大値にします.
ナビゲーションが終了したら、値を返すだけです.
Solution
class Solution {
public int maxProduct(int[] nums) {
int[] max = new int[nums.length];
int[] min = new int[nums.length];
max[0] = min[0] = nums[0];
int result = nums[0];
for(int i=1; i<nums.length; i++){
if(nums[i]>0){
max[i]=Math.max(nums[i], max[i-1]*nums[i]);
min[i]=Math.min(nums[i], min[i-1]*nums[i]);
}else{
max[i]=Math.max(nums[i], min[i-1]*nums[i]);
min[i]=Math.min(nums[i], max[i-1]*nums[i]);
}
result = Math.max(result, max[i]);
}
return result;
}
}
Reference
https://leetcode.com/problems/maximum-product-subarray/
Reference
この問題について([leetcode #152] Maximum Product Subarray), 我々は、より多くの情報をここで見つけました https://velog.io/@timevoyage/leetcode-Maximum-Product-Subarrayテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol