LintCode 最小子数组 && 最大子数组

575 阅读1分钟

题目

给定一个整数数组,找到一个具有最小和的子数组。返回其最小和。

** 注意事项 子数组最少包含一个数字 **

样例 给出数组**[1, -1, -2, 1]**,返回 -3

分析

判断加与不加的情况,这道题的解法很巧妙,类似于背包问题。 每个数组的元素都有两种情况,加与不加,所以我们从第一个元素开始判断,包括第一个元素时,和不包括第一个元素的情况取最小值,进行判断选择。

代码

public class Solution {
    /**
     * @param nums: a list of integers
     * @return: A integer indicate the sum of minimum subarray
     */
    public int minSubArray(ArrayList<Integer> nums) {
        // write your code
        int min_ending_here = nums.get(0);
        int min_so_far = nums.get(0);
        for(int i=1;i<nums.size();i++)
        {
        	min_ending_here = Math.min(nums.get(i), nums.get(i)+ min_ending_here);
        	min_so_far = Math.min(min_ending_here, min_so_far);
        }
        return min_so_far;
    }
}

最大子数组

这道题的思路和最小子数组是一样的,只要更改判断小为判断大就可以了 这里就直接贴出代码

public class Solution {
    /**
     * @param nums: A list of integers
     * @return: A integer indicate the sum of max subarray
     */
    public int maxSubArray(int[] nums) {
        // write your code
        int max_ending_here = nums[0];
        int max_so_far = nums[0];
        for( int i =1 ;i<nums.length; i++) {
            max_ending_here = Math.max( nums[i] , nums[i] + max_ending_here );
            max_so_far = Math.max( max_so_far, max_ending_here);
        }
        return max_so_far;
    }
}