原题:Leetcode53
https://leetcode-cn.com/problems/maximum-subarray/
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
暴力解法
public class Solution {
public int MaxSubArray(int[] nums)
{
int Maxvalue = nums[0];
for (int i = 0; i <= nums.Length - 1; i++)
for (int j = i; j <= nums.Length - 1; j++)
{
if (sum(nums, i, j) >= Maxvalue)
{
Maxvalue = sum(nums, i, j);
}
}
return Maxvalue;
}
public int sum(int[] nums, int i, int j)
{
int sum = 0;
for (int k = i; k <= j; k++)
{
sum += nums[k];
}
return sum;
}
}
动态规划
定义sum表示前几个数的和,只要sum大于0,就可以一直往后加,一旦sum<=0,那么前面的数字就自然而然可以舍去,然后把当前的数字再赋值给sum。MaxValue储存sum和MaxValue的最大值。
public class Solution {
public int MaxSubArray(int[] nums)
{
int MaxValue=nums[0];
int sum = 0;
for (int i = 0; i < nums.Length; i++)
{
if (sum > 0)
sum += nums[i];
else
sum = nums[i];
MaxValue = MaxValue >= sum ? MaxValue : sum;
}
return MaxValue;
}
}