力扣53.最大子数组和

力扣53.最大子数组和

题目描述

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

子数组 是数组中的一个连续部分。

示例 1:

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

输入:nums = [1]
输出:1
示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:

1 <= nums.length <= 105
-104 <= nums[i] <= 104

贪心动态规划

这里dp[i]表示:选取位置i的数作为结尾的情况下能达到的最大的和
这个状态的最大和取决于以下两种情况:

  • 位置i-1也选取了,当前位置i的选取是连续的
  • 选取位置i-1的情况下和是负的,不如单独选取位置i-1的和大,所以放弃位置i-1及以前所选取的数,单独选取位置i

上面两种情况就对应了以下状态转移方程
d p [ i ] = m a x ( d p [ i − 1 ] + n u m s [ i ] , n u m s [ i ] ) dp[i]=max(dp[i-1]+nums[i],nums[i]) dp[i]=maxdp[i1]+nums[i]nums[i]

而最终的最大和应从所有dp中进行选择,因为最大和的连续元素有可能以任意位置作为结尾,为了实现我们可以用一个max变量在每一次计算dp时更新为当前最大值,最终返回max即可:

int maxSubArray(int* nums, int numsSize){
   int i,dp[numsSize],max=nums[0];
   dp[0]=nums[0];
   for(i=1;i<numsSize;i++)
   {
      dp[i]=fmax(dp[i-1]+nums[i],nums[i]);
      if(dp[i]>=max) max=dp[i];
   }
   return max;
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值