最大连续子数组

最大连续子数组

  • 给定一个数组A[0,……,n-1],求A的连续子数组,使得该子数组的和最大。
  • 例如:
    • 数组:1,-2,3,10,-4,7,2,-5
    • 最大子数组:3,10,-4,7,2

暴力法

  • 直接求解A[i,……j]的值
  • 0 ≤ \leq i < n
  • i ≤ \leq j < n
  • i,i+1,……,j-1,j的最大长度为n
  • 因此:时间复杂度O( n 3 n^3 n3)

Code

public int MaxSubArray(int[] A, int n) {
        int maxSum = A[0];
        int currSum;
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                currSum = 0;
                for (int k = i; k <= j; k++) {
                    currSum += A[k];
                }
                if (currSum > maxSum) {
                    maxSum = currSum;
                }
            }
        }
        return maxSum;
    }

分治法

  • 将数组从中间分开,那么最大子数组要么完全在左半边数组,要么完全在右半边数组,要么跨立在分界点上。
  • 完全在左数组、右数组递归解决。
  • 跨立在分界点上:实际上是左数组的最大后缀和右数组的最大前缀的和。因此,从分界点向前扫,向后扫即可。
  • 时间复杂度为O( n l o g 2 n nlog_2n nlog2n)

Code

public int MaxAddSub(int[] a, int from, int to) {
        if (to == from) {
            return a[from];
        }

        int middle = (from + to) / 2;
        int m1 = MaxAddSub(a, from, middle);
        int m2 = MaxAddSub(a, middle+1, to);

        int left = a[middle];
        int now = a[middle];
        for (int i = middle-1; i >= from; i--) {
            now += a[i];
            left = max(left, now);
        }
        int right = a[middle+1];
        now = a[middle+1];
        for (int i = middle+2; i <= to; i++) {
            now += a[i];
            right = max(right, now);
        }
        int m3 = left + right;
        return max(max(m1, m2), m3);
    }

动态规划

  • 记S[i]为以A[i]结尾的数组中和最大的子数组
  • 则:S[i+1] = max(S[i]+A[i+1], A[i+1])
  • S[0] = A[0]
  • 遍历i:0 ≤ \leq i ≤ \le n-1
  • 动态规划:最优子问题
  • 时间复杂度:O(n)
public int MaxAddSub2(int[] a) {
        int result = a[0];
        int sum = a[0];
        for (int i = 1; i < a.length; i++) {
            if (sum > 0) {
                sum += a[i];
            } else {
                sum = a[i];
            }
            if (sum > result) {
                result = sum;
            }
        }
        return result;
    }

你可能感兴趣的:(算法)