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

题目

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

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

样例
给出数组[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;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,898评论 18 399
  • 雪花终于开始飘下 你对冬爱恋了那么久 还未落地就已融化 伸手接住的刹那 痛 化作泪漫天飘洒 无人的旷野像空荡的家 ...
    暗香_e921阅读 2,773评论 1 4
  • 我叫余依白,大一的时候,同学们嫌我的名字绕口,都叫我小白,唯有他,坚持叫我小依。他说,叫小白,好像你每个方面都很白...
    沐儿阅读 6,233评论 15 79