Leetcode 53 最大子序列 C语言
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解
思路1:当总和大于0,代表序列和是增加的;加上当前遍历数字;当综合小于0,则代表在下降,判断前n个数字和当前数字的大小;
int maxSubArray(int* nums, int numsSize){
int max=nums[0];
int sum=0;
for(int i=0;i<numsSize;i++)
{
if(sum<=0)
sum=nums[i];
else
sum=sum+nums[i];
max=max>sum?max:sum;
}
return max;
}
思路2:动态规划dp存放,最后寻找最大值
#define MAX(x, y) ((x) > (y)) ? (x) : (y)
int maxSubArray(int* nums, int numsSize){
int dp[numsSize];
dp[0] = nums[0];
for(int i = 1; i < numsSize; i++)
{
dp[i] = MAX(nums[i], nums[i] + dp[i-1]);
}
int max = dp[0];
for(i = 1; i < numsSize; i++){
if(dp[i] > max)
max = dp[i];
}
return max;
}
思路3:暴力遍历法;三层即每种情况加完后判断最大值,二层是再加当前遍历数字后就判断最大值也能实现所有情况;(注意sum清零)
int maxSubArray(int* nums, int numsSize) {
//算法一:三层循环(最简单方法)
/*
int ThisSum=0;
int MaxSum =0;
int i=0,j=0,k=0;
for(i=0;i<numsSize;i++)
{
for(j=i;j<numsSize;j++)
{
ThisSum = 0;
for(k=i;k<=j;k++)
{
ThisSum += nums[k];
}
if(ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
*/
//算法二:二层循环
int ThisSum,MaxSum,i,j;
MaxSum=-2147483648;
for(i=0;i<numsSize;i++)
{
ThisSum = 0;
for(j=i;j<numsSize;j++)
{
ThisSum += nums[j];
if(ThisSum > MaxSum)
{
MaxSum = ThisSum;
}
}
}
return MaxSum;
}