解法一:
思路:最大子段和max_sum必是以某个下标为i的数结尾,遍历数组,如果当前子段和tmp_sum大于等于0,则nums[i]+tmp_sum一定不会比nums[i]小。
#include <iostream>
#include <vector>
#include <limits>
using namespace std;
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int max_sum = INT_MIN;
int tmp_sum = 0;
for(int i=0;i<nums.size();++i)
{
if (tmp_sum >= 0)
tmp_sum += nums[i];
else
tmp_sum = nums[i];
if (tmp_sum > max_sum)
max_sum = tmp_sum;
}
return max_sum;
}
}
int main()
{
Solution s;
vector<int> v;
v.push_back(-2);
v.push_back(-3);
v.push_back(-1);
cout<<s.maxSubArray(v)<<endl;
return 0;
}
解法二(二分法):
C++代码:
class Solution {
public:
int get_max_subArray(vector<int> &nums, int l_hand, int r_hand)
{
if (l_hand > r_hand) return INT_MIN;
if (l_hand == r_hand) return nums[l_hand];
int mid = (l_hand+r_hand)/2;
//左边最大子段和
int l_max = get_max_subArray(nums, l_hand, mid-1);
//右边最大子段和
int r_max = get_max_subArray(nums, mid+1, r_hand);
int mid_sum = nums[mid];
//以下标为mid-1结束的最大子段和
int l_sub_max = 0;
以下标为mid-1结束的当前子段和
int l_tmp_max = 0;
//以下标为mid+1开始的最大子段和
int r_sub_max = 0;
//以下标mid+1开始的当前子段和
int r_tmp_max = 0;
for (int i=mid-1;i>=l_hand;--i)
{
l_tmp_max += nums[i];
if (l_tmp_max>l_sub_max)
l_sub_max = l_tmp_max;
}
for (int i = mid+1;i<=r_hand;++i)
{
r_tmp_max += nums[i];
if (r_tmp_max>r_sub_max)
r_sub_max = r_tmp_max;
}
if (l_sub_max > 0)
mid_sum += l_sub_max;
if (r_sub_max > 0)
mid_sum += r_sub_max;
if (l_max >= mid_sum && l_max >= r_max)
return l_max;
if (r_max >= mid_sum && r_max >= l_max)
return r_max;
return mid_sum;
}
int maxSubArray(vector<int>& nums) {
return get_max_subArray(nums, 0, nums.size()-1);
}
};