leetcode-最大子序和

直接想到动态规划
class Solution { public: int maxSubArray(vector<int>& nums) { vector<int> dp(nums.size(),0); dp[0] = nums[0]; for(int i = 1; i < nums.size(); i++){ if(dp[i-1]<0) // 负贡献,所以从当前为从新开始 dp[i] = nums[i]; else // 历史加上当前位 dp[i] = dp[i-1]+nums[i]; } int res = INT_MIN; for(int i = 0; i < dp.size(); i++){ res = max(res, dp[i]); } return res; } };
过了一个月没有直接想到动态规划,想到了下面
class Solution { public: int maxSubArray(vector<int>& nums) { int sum = 0; int res = INT_MIN; vector<int> temp; int start = 0, end = 0; int substart = 0, subend = 0; for(int i = 0; i < nums.size(); i++){ if(sum<0){ // 之前和为负贡献,重新开始 substart = i; subend = i; sum = nums[i]; }else{ // 非负贡献,则++ temp.push_back(nums[i]); sum = sum + nums[i]; subend++; } if(sum > res){ start = substart; end = subend; res = sum; } // res = max(res,sum); } cout<< start<<" "<<end<<endl; // 并且返回最大和子数组所在区间 return res; } };

浙公网安备 33010602011771号