问题描述:
Find the contiguoussubarray within an array (containing at least one number) which has the largestsum.
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
.
问题分析:
《剑指Offer》题31
输入一个整型数组,整型数组里有正数也有负数。数组中一个或连续多个正数组成一个子数组。要求所有子数组的和的最大值。(时间复杂度为O(n))
显然,一个数值加上一个负值,所得到的结果自然小于其本身。
使用一个curSum变量来记录当前所考察的子数组的当前和,curMax变量来记录当前所得到的最大值;
遍历数组,若curSum为负值,则加上当前值num[i],所得到的和一定小于num[i],则直接将前面的子数组舍弃,取当前值为下一个继续考察的子数组的起点,则curSum=nums[i];
若curSum为正值,可想而知,直接加上num[i]会得到更大值;
比较当前获得的curSum与之前获得的最大值,每一步都得到当前的最大值,则最终获得的最大值即为curMax所记录的值。
代码:
public class Solution { public int maxSubArray(int[] nums) { // 消除不合法情况 if ((nums == null) || (nums.length == 0)) return 0; // 初始化 int curSum = nums[0]; // 记录当前的子数组的Sum总和 int curMax = nums[0]; // 记录当前的最大Sum值 // 进行遍历 for (int i = 1; i < nums.length; i++) { // 因为若之前的子数组的和小于0,加上当前值只会让总值Sum减小,故选择丢弃之前值 if (curSum <= 0) curSum = nums[i]; else curSum += nums[i]; // 判断是否大于之前的最大值 if (curSum > curMax) curMax = curSum; } return curMax; } }