maximum subarray

来源:互联网 发布:钢笔 知乎 编辑:程序博客网 时间:2024/06/16 22:36

问题描述:一个int数组,求出其最大子串。也就是求出其连续元素和的最大值


解决:这是刷Leetcode碰到的第一个动态规划的题。

在这个题目,里假设nums[i]到nums[j]这一段连续和最大,那么必然任意的i<k<j,nums[i]到nums[k]这一段的和大于0,

如果出现小于0的情况,那么nums[k+1]到nums[j]的连续和更大。根据上面的分析,当来到元素nums[i]时,用local表示不包含nums[i]前面的最大子串和,

如果local大于0,那么包含nums[i]的最大子串和就是local+nums[i],否则就是nums[i].这样遍历数组后,可以求得包含每一个元素的局部最优解,

但是要求得全局最优解,还需要在这些局部最优解里挑出最大的一个。


/* * Find the contiguous subarray within an array (containing at least one number) which has the largest sum.For example, given the array [-2,1,-3,4,-1,2,1,-5,4],the contiguous subarray [4,-1,2,1] has the largest sum = 6 */public class MaxSubarray {        public static int maxSubArray(int[] nums) {                  if(nums == null || nums.length == 0) {                        return -1;                }                                int local = nums[0];                int global = nums[0];                for(int i=1; i<nums.length; i++) {                        local = Math.max(nums[i], nums[i] + local);                        global = Math.max(global, local);                }                return global;        }}