題目描述:數組
給定一個整數數組 nums
,找到一個具備最大和的連續子數組(子數組最少包含一個元素),返回其最大和。spa
示例:code
輸入: [-2,1,-3,4,-1,2,1,-5,4],blog
輸出: 6ci
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。get
方法一:暴力法O(n^2)io
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)class
我本身沒想出來o(╥﹏╥)o,參考的別人的作法。方法
設數組中的元素nums[i]前面的子序和爲sum,若sum大於等於0,則sum+nums[i],若sum小於0,則nums[i]加上前面的sum,都還不如不加,直接設置自身即爲當前最大的子序和。因此咱們直接記sum=nums[i];每次操做都要比較最大子序和與當前sum的大小,判斷是否須要更新最大子序和。di
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; }
方法三: