【C++】遞歸之「數組的最大子數組」

我已沒法用語言來描述遞歸有多牛逼。ios

 

 

 

 

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


int main()
{

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

int max_sub_array(vector<int> &data, int left, int 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, left, mid);//左邊子數組的和
        max_right = max_sub_array(data, mid + 1, right);//右邊子數組的和
        //合併
        max_cross = max_crossing_sub_array(data, left, mid, right);//跨越中心的子數組的和
        Smax = max(max(max_left, max_right), max_cross);
        return Smax;
    }
}

int max_crossing_sub_array(vector<int>& data, int left, int mid, int right)
{
    int left_max = -99999;//不可能達到的一個數
    int right_max = -99999;
    int sum = 0;
    /*計算以mid結尾的最大的子數組和,左邊子數組*/
    for (int i = mid; i >= left; --i) {
        sum += data.at(i);
        if (sum > left_max)
            left_max = sum;
    }
    sum = 0;
    /*計算以mid+1開始的最大的子數組和,右邊子數組*/
    for (int i = mid + 1; i <= right; ++i) {
        sum += data.at(i);
        if (sum > right_max)
            right_max = sum;
    }
    return left_max + right_max;
}
相關文章
相關標籤/搜索