给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
思路:一开始尝试过暴力检索(O(n^3))所有情况,但挂在了题目铺面页面两页的测试用例中,故借鉴了大佬的DP。
代码实现:
class Solution {
public static int maxSubArray(int[] nums) {
if (nums==null||nums.length<1)
return 0;
if (nums.length==1)
return nums[0];
int maxsum = 0; //存放结果
int tempsum = 0; //暂存一轮累加的和
for (int i=0;i<nums.length;i++)
{
if (tempsum > 0)
tempsum += nums[i];
else
//如果当前轮的累加和不大于0,则放弃该连续序列。
tempsum = nums[i];
//如果当前累加序列和大于已经检索的自序列和,则替换为当前最大累加和
maxsum = Math.max(maxsum, tempsum);
}
return maxsum;
}
}
该题是DP的经典题目,遍历一次数组,得出所有累加和大于0的连续序列,使用两个字段,分别记录当前累加和和当前已知最大累加和。