Maximum Subarray(求数组的子数组之和的最大值)

来源:互联网 发布:福建广电网络宽带费用 编辑:程序博客网 时间:2024/05/21 07:55

问题:求数组的子数组之和的最大值

算法:

1、求得数组 的第一个正数的下标 和 最后一个正数的下标

2、通过下标判断,如果该数组的值都是负值,那么从数组中取最大值输出。否则进行下一步。

3、将相邻的正数合并,相邻的负数合并。形成正负相间的数组

4、将第一个正数和下一个负数相加,如果结果大于零,那么加到下一个正数里面,如果小于零,那么不加到下一个正数里面。遍历整个正负相间的数组,选出相加最大的值,即为最大值。

注意:算法实现为了实现更高的效率,将第三步和第四步合并。

时间复杂度:O(n)

代码实现:

<span style="font-size:14px;">int maxSubArray(vector<int>& nums) {            int pos_begin=-1; //first pos numint pos_end=-1; //last neg numint result=0;int sum_pos=0;/*取第一个正数的下标和最后一个正数的下标*/    for(int i=0;i<nums.size();i++){if(nums[i]>0){pos_begin=i;break;}}for(int i=nums.size()-1;i>=0;i--){if(nums[i]>0){pos_end=i;break;}}//cout<<pos_begin<<"    "<<pos_end<<endl;    /*对于全是负数的处理*/if(-1==pos_begin){result=nums[0];for(int i=0;i<nums.size();i++){    if(result<nums[i]){result=nums[i];}}return result;}else {  for(int i=pos_begin;i<=pos_end;i++)      {    sum_pos+=nums[i];if(sum_pos>result)result=sum_pos;if(sum_pos<=0)sum_pos=0;  }              return result;}  }</span>


2 0