题目
输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。
要求:时间复杂度为 O(n)O(n),空间复杂度为 O(n)O(n)
进阶:时间复杂度为 O(n)O(n),空间复杂度为 O(1)O(1)
思路
代码
分治策略解法
class Solution {
public:
int FindMaxCrossingSubArray(vector<int>& array, int low, int mid, int high,
int& max_left, int& max_right)
{
int left_sum = -10000;
int sum = 0;
int right_sum = -10000;
int maxValue= 0;
for (int i = mid; i >= low; i--)
{
sum += array[i];
if (sum > left_sum)
{
left_sum = sum;
max_left = i;
}
}
sum = 0;
for (int j = mid + 1; j <= high; j++)
{
sum += array[j];
if (sum > right_sum)
{
right_sum = sum;
max_right = j;
}
}
maxValue = left_sum + right_sum;
return maxValue;
}
void FindMaximunSubarray(vector<int>& array, int low, int high, int& index_left
, int& index_right, int& maxValue)
{
int left_low = 0, left_high = 0, left_sum = 0;
int right_low = 0, right_high = 0, right_sum = 0;
int cross_low = 0, cross_high = 0, cross_sum = 0;
int mid = 0;
if (low == high)
{
index_left = low;
index_right = high;
maxValue = array[low];
}
else
{
mid = (low + high) / 2;
FindMaximunSubarray(array, low, mid, left_low, left_high, left_sum);
FindMaximunSubarray(array, mid+1, high, right_low, right_high, right_sum);
cross_sum = FindMaxCrossingSubArray(array, low, mid, high, cross_low, cross_high);
if (left_sum >= right_sum && left_sum >= cross_sum)
{
index_left = left_low;
index_right = left_high;
maxValue = left_sum;
}
else if (right_sum >= left_sum && right_sum >= cross_sum)
{
index_left = right_low;
index_right = right_high;
maxValue = right_sum;
}
else
{
index_left = cross_low;
index_right = cross_high;
maxValue = cross_sum;
}
}
}
int FindGreatestSumOfSubArray(vector<int> array) {
int left = 0, right = 0, sum = 0;
FindMaximunSubarray(array, 0, array.size() - 1, left, right, sum);
return sum;
}
};