【C++】数组的最大子数组

前端之家收集整理的这篇文章主要介绍了【C++】数组的最大子数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我已无法用语言来描述递归有多牛逼。

 

 

 

 

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int max_sub_array(vector<int>& data,int left,1)">int right);
int max_crossing_sub_array(vector<int mid,1)"> right);


 main()
{

    vector<int> data = { 3,0,1)">5,1)">2,1)">7,1)">8,1)">9,1)">6,1)">1 };
    //获取序列元素个数
    int length = 9;
    int left = 0int right = 8int sum = ;
    sum = max_sub_array(data,left,right);
    cout << sum << "   ";
}

int> &data,1)"> right)
{
    if (left >= right)因为这个时候表示已经分解到只剩一个元素了,就是递归的终止条件,子数组的最大值就是元素本身,返回
    {
        return data[left];
    }
    else
    {
        将序列一分为二获取中间位置
        int mid = (left + right) / 2;
        int max_left,max_right,max_cross,Smax;用来存储子数组的和
        分治
        max_left = max_sub_array(data,mid);左边子数组的和
        max_right = max_sub_array(data,mid + 1,right);右边子数组的和
        合并
        max_cross = max_crossing_sub_array(data,mid,1)">跨越中心的子数组的和
        Smax = max(max(max_left,max_right),max_cross);
         Smax;
    }
}

int left_max = -99999;不可能达到的一个数
    int right_max = -99999/*计算以mid结尾的最大的子数组和,左边子数组*/
    for (int i = mid; i >= left; --i) {
        sum += data.at(i);
        if (sum > left_max)
            left_max = sum;
    }
    sum = 计算以mid+1开始的最大的子数组和,右边子数组int i = mid + 1; i <= right; ++ right_max)
            right_max = sum;
    }
    return left_max + right_max;
}

 

猜你在找的算法相关文章