最大子数组问题

来源:互联网 发布:北京科技大学 网络咨询 编辑:程序博客网 时间:2024/04/27 14:07

算法导论:最大子数组,c++实现

#include "stdafx.h"
#include<iostream>
#include<vector>
#include<limits>
using namespace std;


vector<int> find_max_crossing_subarray(vector<int>&A, int low, int mid, int high)
{
vector<int> returnValue;
int left_sum = numeric_limits<int>::min();
int sum = 0;
int max_left = -1;
for (int i = mid; i >= low; --i)
{
sum = sum + A[i];
if (sum > left_sum)
{
left_sum = sum;
max_left = i;
}


}
int right_sum = numeric_limits<int>::min();
int max_right = -1;
sum = 0;
for (int j = mid + 1; j <= high; ++j)
{
sum = sum + A[j];
if (sum > right_sum)
{
right_sum = sum;
max_right = j;
}
}
returnValue.push_back(max_left);
returnValue.push_back(max_right);
returnValue.push_back(left_sum + right_sum);
return returnValue;
}


vector<int> find_maxmum_subarray(vector<int>A, int low, int high)
{
if (high <= low)
{
vector<int> returnValue;
returnValue.push_back(low);
returnValue.push_back(high);
returnValue.push_back(A[low]);
return returnValue;
}
else
{
vector<int>left;
vector<int>right;
vector<int>cross;
int mid = (low + high) / 2;
left = find_maxmum_subarray(A, low, mid);
right = find_maxmum_subarray(A, mid + 1, high);
cross = find_max_crossing_subarray(A, low, mid, high);
if (left[2] >= right[2] && left[2] >= cross[2])
return left;
else if (right[2] >= left[2] && right[2] >= cross[2])
return right;
else
return cross;
}
}


int main()
{
vector<int> num;
int temp = 0;
while (cin >> temp)
{
num.push_back(temp);
}
vector<int>result = find_maxmum_subarray(num, 0, num.size() - 1);
for (unsigned int i = 0; i < result.size(); ++i)
cout << result[i] << " ";
return 0;
}


0 0
原创粉丝点击