[LeetCode] 最大連續子序列和或者乘積,以及最長連續子串

#題目java

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.code

思路

其實無論是最大連續自序列和仍是乘積,關鍵的一個概念是定義一個變量叫作 「包含當前值的最大連續序列值(和/乘積)」,舉例來講curMaxit

這個值的存在使得包含下一個位置的最大連續序列值的求解成爲可能,以最大連續自序列求和爲例,io

curMax(x+1) = max(A[x+1], curMax(x) + A[X])ast

對於最大連續自序列乘積,須要紀錄兩個,一個是包含當前值的最大連續子序列乘積, 一個是包含當前值的最小自序列乘積class

curMax(x + 1) = Math.max(curMax(x)*A[x], curMin(x)*A[x], A[x]) curMin(x + 1) = Math.min(curMax(x)*A[x], curMin(x)*A[x], A[x])變量

由於包含當前值的最大值(最小值)只能由這三種可能構成co

代碼

最大連續自序列和block

public class Solution {
    public int maxSubArray(int[] A) {
        int curMax = A[0];
        int max = A[0];
        for (int i = 1; i < A.length ; i++) {
            curMax = Math.max(A[i], curMax + A[i]);
            max = Math.max(max, curMax);
        }
        return max;
    }
}

最大連續子序列乘積return

public class MaxProductSubArray {

    public int maxProduct(int[] A) {
        int curMax = A[0];
        int curMin = A[0];
        int max = A[0];

        for(int i = 1; i < A.length; i++) {
            // 注意這裏先存起來,下面要在更新以後再用一次
            int temp = curMax * A[i];
            curMax = Math.max(A[i], Math.max(curMax * A[i], curMin * A[i]));
            curMin = Math.min(A[i], Math.min(temp, curMin * A[i]));
            max = Math.max(curMax, max);
        }

        return max;
    }
}

最長連續子串的想法

d[i][j]表示A[0...i],B[0...j],而且以A[i]和B[j]結尾的最長公共連續子串的長度

d[i][j] = d[i-1][j-1] if A[i] == B[j] d[i][j] = 0 if A[i] != B[j]

相關文章
相關標籤/搜索