leetcode53. 最大子序和
题目描述:
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
方法一:暴力法O(n^2)
class Solution{ public: int maxSubArray(vector<int>& nums) { int maxSum = nums[0]; int sum = nums[0]; for(int i = 0; i < nums.size(); ++i){ sum = 0; for(int j = i; j < nums.size(); ++j){ sum += nums[j]; maxSum = max(sum, maxSum); } } return maxSum; } };
方法二:动态规划O(n)
我自己没想出来o(╥﹏╥)o,参考的别人的做法。
设数组中的元素nums[i]前面的子序和为sum,若sum大于等于0,则sum+nums[i],若sum小于0,则nums[i]加上前面的sum,都还不如不加,直接设置自身即为当前最大的子序和。所以我们直接记sum=nums[i];每次操作都要比较最大子序和与当前sum的大小,判断是否需要更新最大子序和。
class Solution{ public: int maxSubArray(vector<int>& nums){ int maxSum = nums[0]; int sum = 0; for(int i=0;i<nums.size();++i){ if(sum < 0) sum = nums[i]; else sum += nums[i]; maxSum = max(sum, maxSum); } return maxSum; } }; int main(){ Solution solution; vector<int> vec; int i = 0; do{ cin>>i; vec.push_back(i); }while(getchar() != '\n'); int maxSum = solution.maxSubArray(vec); cout<<"最大子序和:"<<maxSum<<endl; return 0; }
方法三: