面试题42.连续子数组的最大和
题目
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。
思路
思路如下.
- 通过设置ans,从头开始遍历数组,sum累加所有数字,然后每次累加之后,都计算一下当前的最大值。更新ans
- 动态规划
代码
- 打擂台
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int ans = INT_MIN;
int sum = 0;
for(int j = 0; j < nums.size(); j++)
{
sum += nums[j];
ans = max(ans,sum);// 比较最大值
if(sum < 0)
{
sum = 0; // 也就是遇到了负数 直接重开
}
}
return ans;
}
};
- 动态规划
class Solution {
public int maxSubArray(int[] nums) {
int res = nums[0];
for(int i = 1; i < nums.length; i++)
{
nums[i] += Math.max(nums[i - 1],0);// 先比较nums[i - 1] 和0的大小 Nums[i]小于0 那就直接从nums[i]开始
res = Math.max(res,nums[i]);// 如果nums[i] < 0 那么就没有必要加上去
}
return res;
}
}