最大子数组问题的递归解法

递归求解左子数组和右子数组的最大子数组。find_max_crossing_subarray不属于递归部分。

最大子数组问题实际上存在一个线性时间的算法, 并未使用分治方法。

#include <iostream>
using namespace std;

int find_max_crossing_subarray(int arr[], int low, int mid, int high, int& max_l, int& max_r)
{
        int left_sum = 0;
        int sum = 0;
        for(int i = mid; i >= low; --i)
        {
                sum += arr[i];
                if(sum > left_sum)
                {
                        left_sum = sum;
                        max_l = i;
                }
        }
        int right_sum = 0;
        sum = 0;
        for(int i = mid+1; i <= high; ++i)
        {
                sum += arr[i];
                if(sum > right_sum)
                {
                        right_sum = sum;
                        max_r = i;
                }
        }
        return right_sum + left_sum;
}

int find_max_subarray(int arr[], int low, int high, int& ll, int& hh)
{
        if(low == high)
        {
                ll = hh = low;
                return arr[low];
        }
        else
        {
                int Mid = (low+high)/2;
                int left_low = -1;
                int left_high = -1;
                int left_sum = find_max_subarray(arr, low, Mid, left_low, left_high);
                int right_low = -1;
                int right_high = -1;
                int right_sum = find_max_subarray(arr, Mid+1, high, right_low, right_high);
                int mid_low = -1;
                int mid_high= -1;
                int cross_sum = find_max_crossing_subarray(arr,low, Mid, high, mid_low, mid_high);
                if(left_sum >=right_sum && left_sum >=cross_sum)
                {
                        ll= left_low;
                        hh =left_high;
                        return left_sum;
                }
                if(right_sum >=left_sum && right_sum >=cross_sum)
                {
                        ll= right_low;
                        hh =right_high;
                        return right_sum;
                }
                if(cross_sum >=right_sum && cross_sum>=left_sum)
                {
                        ll= mid_low;
                        hh =mid_high;
                        return cross_sum;
                }
        }
}
int main()
{
        int a[] = {1,2,-1,-2,5, 6, -4, 8,-1,0};
        int l = 0, r = 0;
        //int ret = find_max_crossing_subarray(a, 0, 4, 9, l, r);
        int ret = find_max_subarray(a, 0, 9, l, r);

        std::cout << ret <<std::endl;
        std::cout << l <<std::endl;
        std::cout << r <<std::endl;
        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值