應用Kadane算法得到最大產品子陣列似乎很棘手。雖然我能夠獲得最大產品,但我並沒有真正獲得最大產品子陣列的正確範圍。使用Kadanes算法得到最大產品子陣列的範圍
http://www.geeksforgeeks.org/maximum-product-subarray/解釋了獲得最大產品的方式,但我沒有得到我們如何得到子陣列的範圍。
有人能幫我理解範圍問題嗎?這是一個標準的面試問題,我想確保我理解產品案例的邏輯,而不是僅僅說可以修改最大總和子數組來回答最大產品子數組情況。
謝謝!!
應用Kadane算法得到最大產品子陣列似乎很棘手。雖然我能夠獲得最大產品,但我並沒有真正獲得最大產品子陣列的正確範圍。使用Kadanes算法得到最大產品子陣列的範圍
http://www.geeksforgeeks.org/maximum-product-subarray/解釋了獲得最大產品的方式,但我沒有得到我們如何得到子陣列的範圍。
有人能幫我理解範圍問題嗎?這是一個標準的面試問題,我想確保我理解產品案例的邏輯,而不是僅僅說可以修改最大總和子數組來回答最大產品子數組情況。
謝謝!!
您提供的鏈接似乎假設所有元素都是正面的。但在我看來,這不是一個安全的假設。我有返回代碼來獲取最大產品的子數組。我已經使用了Kadane's算法中使用的相同邏輯。代碼似乎適用於我的各種輸入。請讓我知道是否有問題。
public static int[] getMaxSubArray(int []arr){
int maxEndingHere = arr[0], maxSoFar = arr[0], startIndex =0, start =0,end=0;
for(int i=1;i<arr.length;i++){
if(maxEndingHere<0){
maxEndingHere = arr[i];
startIndex = i;
}else{
maxEndingHere *= arr[i];
}
if(maxEndingHere>=maxSoFar){
maxSoFar = maxEndingHere;
start = startIndex;
end = i;
}
}
if(start<=end)
return Arrays.copyOfRange(arr, start, end+1);
return null;
}
{6, 3, -10, 0, 2}
輸出= {6,3}
{-2,1,-3,4,-1,2,1,-5,4}
輸出= {4}
{-1,-2,-9,-6}
輸出= {-1}
採樣輸入= {-2,1,-3,4,-1,2,1,-5,4}輸出= {-2,1,-3,4,-1,2,1,-5, 4} – Blacklabel
def max_subarray(A):
max_ending_here = max_so_far = 0
max_start = start = 0
max_end = end = 0
# the range is [max_start, max_end)
for i, x in enumerate(A):
if max_ending_here + x > 0:
max_ending_here = max_ending_here + x
end = i+1
else:
max_ending_here = 0
start = end = i
if max_ending_here > max_so_far:
max_so_far = max_ending_here
max_start = start
max_end = end
return (max_start, max_end)
它有三個基本情況:
你需要有兩個變量:
min
持有最小值至今
max
持有最大值至今。
現在對於case 3
min
和max
將被重置爲1。
對於case 1
:max
將max * a[i]
和min
將是min*a[i]
和1.
最小對於case 2
:max
將最大的a[i] * min
和1
,但min
值將是max * a[i].
下面是代碼:
private static int getMaxProduct(int[] a){
int minCurrent = 1, maxCurrent = 1, max = Integer.MIN_VALUE;
for (int current : a) {
if (current > 0) {
maxCurrent = maxCurrent * current;
minCurrent = Math.min(minCurrent * current, 1);
} else if (current == 0) {
maxCurrent = 1;
minCurrent = 1;
} else {
int x = maxCurrent;
maxCurrent = Math.max(minCurrent * current, 1);
minCurrent = x * current;
}
if (max < maxCurrent) {
max = maxCurrent;
}
}
//System.out.println(minCurrent);
return max;
}
it不是卡達恩的算法,而是與之類似。 – Trying