LeetCode 53.最大子序和

it2022-05-05  131

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。算法:动态规划。设f[i]表示以第i个元素结尾时最大子序和。

那么f[i]=max(nums[i],f[i-1]+nums[i])。即选择是否将第i个数字拼接或者以第i个数字作为开始。

class Solution { public: int maxSubArray(vector<int>& nums) { int n=nums.size(); vector<int>f(n); f[0]=nums[0]; int ans=f[0]; for(int i=1;i<n;i++){ f[i]=max(nums[i],f[i-1]+nums[i]); ans=max(ans,f[i]); } return ans; } };

当然,此题还有空间复杂度为O(1)的精妙解法

class Solution { public: int maxSubArray(vector<int>& nums) { int res=INT_MIN,s=0; for(auto x:nums){ if(s<0) s=0; s+=x; res=max(res,s); } return res; } };

此解法实际上是利用状态转移的性质优化了空间

转载于:https://www.cnblogs.com/programyang/p/11152773.html

相关资源:各显卡算力对照表!

最新回复(0)