Maximum Subarray

来源:互联网 发布:傲剑绿色版升级数据 编辑:程序博客网 时间:2024/06/05 19:57

原题:

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.

即找出给定数组子数组之和的最大值。


思考过程:

一开始想错了。错的想法就不写了,带偏思路就不好了。这样理解:负数或者负数组可以把非负数分成一些组,两个相邻的非负数组若想连起来,必须保证 前面非负数组之和 比两个非负数组之间的负数或负数组绝对值大,这样它们才有连在一起的理由,连在一起才保证比后一个非负数组的和大。按照这个思路去解决问题。


解题思路:

先把数组最前面的非正数跳过。之后调用递归函数:如果是正数(组),更新ret(用来存储最后结果),如果不是,那判断它后面跟的负数组绝对值是否比它大,如果是那就跳过这个负数组更新正数组的和为0,遍历数组后面的内容。如果不是,那就让正数组的和加上负数组的和,继续向后遍历。


结果代码:

int len = 0;    public int maxSubArray(int[] nums) {        int i = 0,sum = 0,ret = nums[0];        len = nums.length;        while (i < len && nums[i] <= 0){//先跳过数组开始的非正数            ret = Math.max(ret,nums[i]);            i++;        }        while (i < len) {//遍历数组            int num = nums[i];            if (num >= 0) {//如果是正数,把值加到正数组的和中                sum += num;                ret = Math.max(ret, sum);//更新ret                i++;            } else {//如果遇到负数                int[] info = isEnd(nums, i, sum);//判断正数组后面跟的负数(组)绝对值是否比它大                i = info[0];                sum = (info[1] > 0) ? info[1] : 0;//如果正数组与负数组和为正,sum更新,继续向后遍历数组;否则sum设为0,从下一个正数组重新开始            }        }        return ret;    }    public int[] isEnd(int[] nums,int begin,int sum){        int i = begin;        while (i < len && nums[i] <= 0){            sum += nums[i];            i++;        }        int[] info = new int[2];        info[0] = i;//用于存储跳过的非正数个数        info[1] = sum;//存储前面正数组与这个非正数组的和        return info;    }