public int maxSubArray(int[] a) {

        if (a == null || a.length == 0) return 0;

        int maxSoFar = a[0];
        int maxEndingHere = a[0];

        for (int i = 1; i < a.length; i++) {
            maxEndingHere = Math.max(maxEndingHere + a[i], a[i]);
            maxSoFar = Math.max(maxSoFar, maxEndingHere);
        }
        return maxSoFar;
    }
We use two max, maxSoFar -> max sub array found so far and maxEndingHere -> maximum sub array size
that ends in this index. This is in place solution and time Complexity is O(N).
src/problems/medium/MaximumSubarray.java