53. 最大子序和(C语言/C++)---动态规划

目录

· 前言
· 题目详情 
· 动态规划(C语言解答、C++解答)


 

前言

动态规划(英语:Dynamic programming,简称 DP),动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。

动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。动态规划往往用于优化递归问题,例如斐波那契数列,如果运用递归的方式来求解会重复计算很多相同的子问题,利用动态规划的思想可以减少计算量。

通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,具有天然剪枝的功能,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。

 

链接:https://leetcode-cn.com/tag/dynamic-programming/
来源:力扣(LeetCode)

 

题目详情 

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:
输入:
[-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解


——题目难度:简单


 


 

  1. 动态规划

  • C语言
int maxSubArray(int* nums, int numsSize){
        if(numsSize==0)    return 0;
        int sum=nums[0],ans=nums[0];
        for(int i=1;i<numsSize;i++)
        {
            if(sum>0){
                sum=sum+nums[i];
            }else{
                sum=nums[i];
            }

            if(sum>ans){
                ans=sum;
            }
        }
        return ans;
}
  • C++ 
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
    	int n = nums.size();
        if(n == 0) return 0;
        
        int tempsum = nums[0], maxsum = nums[0];
        for(int i=1;i<n;i++)
        {
        	if(tempsum < 0) {	  //tempsum < 0时,代表对之后的结果无增益 
        	   tempsum = nums[i]; //更新tempsum
			}else{
			   tempsum += nums[i];
			}
			
			maxsum = tempsum>maxsum? tempsum:maxsum;
        }
        
        return maxsum;
	}
};

 
结果

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

重剑DS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值