Leetcode 53 最大子序列 C语言

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;  
}	
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值