Minimum Subarray
37% Accepted
Given an array of integers, find the subarray with smallest sum.
Return the sum of the subarray.
Have you met this question in a real interview? Yes
Example
For [1, -1, -2, 1], return -3
Note
The subarray should contain at least one integer.
Tags Expand
- Greedy
- LintCode Copyright
- Subarray Array
思路
- 动态规划
- state: sum[i]是前i个数中,最小的subarray sum
- function: sum[i] = A[i] + (sum[i-1] < 0 ? sum[i-1] :0) 因为是连续的,所以要加上A[i],如果前面和大于零,就加上
- initialize: sum[0] = A[0]
- answer: 设置一个min去存最小值
- 优化: 因为就用到了sum[i]和sum[i-1],所以用两个寄存器就可以了,没必要用数组
- 这道题曾经有过小错误,
- 就是min不是Integer.MAX_VALUE 而是 A.get(0)
public class Solution {
    /**
     * @param nums: a list of integers
     * @return: A integer indicate the sum of minimum subarray
     */
    public int minSubArray(ArrayList<Integer> A) {
        // write your code
        if (A == null || A.size() == 0) {
            return Integer.MIN_VALUE;
        }
        //int[] sum = new int[A.length];
        //sum[0] = A[0];
        int min = A.get(0);
        int cur;
        int pre = A.get(0);
        for (int i = 1; i < A.size(); i++) {
            cur = A.get(i) + (pre < 0 ? pre : 0 );
            min = Math.min(min, cur);
            pre = cur;
        }
        return min;
    }
}