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


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

    #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;
    }
  • 相关阅读:
    Linux日常之命令sort
    Linux日常之命令sed
    Linux日常之命令grep
    Linux日常之命令awk
    Linux日常之命令tee
    Linux日常之数据重定向
    Hibernate打印SQL及附加参数
    使用D3 Geo模块画澳大利亚地图
    基于Spring-WS的Restful API的集成测试
    做项目时需要考虑的安全性问题
  • 原文地址:https://www.cnblogs.com/masbay/p/14032650.html
Copyright © 2020-2023  润新知