每日一题(3)
最大子数组和
方法一直接暴力解法
class Solution
{
public:int maxSubArray(vector<int> &nums){int max = INT_MIN;int size = nums.size();for (int i = 0; i < size; i++){int sum = 0;for (int j = i; j < size; j++){sum += nums[j];if (sum > max){max = sum;}}}return max;}
};
方法二动态规划
class Solution {
public:
//5 4 -10 7 8int maxSubArray(vector<int>& nums) {int n=nums.size();vector<int>dp(n,0);dp[0]=nums[0];int ret=dp[0];for(int i=1;i<n;++i){dp[i]=max(nums[i],dp[i-1]+nums[i]);ret=max(dp[i],ret);}return ret;}
};
定义 dp[i]
表示以第 i
个元素结尾的最大子数组和状态转移方程对于每个位置 i
有两种选择:将当前元素加入之前的子数组(即 dp[i-1] + nums[i]
)从当前元素重新开始一个新的子数组(即 nums[i]
)因此dp[i] = max(nums[i], dp[i-1] + nums[i])
最终结果就是所有 dp[i]
中的最大值