最大子数组—— Java -分治策略
2015-03-19 17:10
302 查看
public class FindMaxSubarray
{
public static int findMaxCrossingSubarray(int[] a, int low, int mid, int high)
{
int left_sum = 0, right_sum = 0;
int sum = 0;
for (int i = mid; i >= 0; --i)
{
sum += a[i];
if (sum > left_sum)
{
left_sum = sum;
}
}
sum = 0;
for (int j = mid + 1; j <= high; ++j)
{
sum += a[j];
if (sum > right_sum)
{
right_sum = sum;
}
}
return left_sum + right_sum;
}
public static int findMaximumSubarray(int[] a, int low, int high)
{
int mid = 0;
int leftSum = 0, rightSum = 0, crossSum = 0;
if (high == low)
{
return a[low];
}
else
{
mid = low + (high - low) / 2;
leftSum = findMaximumSubarray(a, low, mid);
rightSum = findMaximumSubarray(a, mid + 1, high);
crossSum = findMaxCrossingSubarray(a, low, mid, high);
if (leftSum >= rightSum && leftSum >= crossSum)
{
return leftSum;
}
else if (rightSum >= leftSum && rightSum >= crossSum)
{
return rightSum;
}
else
return crossSum;
}
}
public static void main(String[] args)
{
int[] a = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};
int sum = findMaximumSubarray(a, 0, a.length - 1);
System.out.println(sum);
}
}
{
public static int findMaxCrossingSubarray(int[] a, int low, int mid, int high)
{
int left_sum = 0, right_sum = 0;
int sum = 0;
for (int i = mid; i >= 0; --i)
{
sum += a[i];
if (sum > left_sum)
{
left_sum = sum;
}
}
sum = 0;
for (int j = mid + 1; j <= high; ++j)
{
sum += a[j];
if (sum > right_sum)
{
right_sum = sum;
}
}
return left_sum + right_sum;
}
public static int findMaximumSubarray(int[] a, int low, int high)
{
int mid = 0;
int leftSum = 0, rightSum = 0, crossSum = 0;
if (high == low)
{
return a[low];
}
else
{
mid = low + (high - low) / 2;
leftSum = findMaximumSubarray(a, low, mid);
rightSum = findMaximumSubarray(a, mid + 1, high);
crossSum = findMaxCrossingSubarray(a, low, mid, high);
if (leftSum >= rightSum && leftSum >= crossSum)
{
return leftSum;
}
else if (rightSum >= leftSum && rightSum >= crossSum)
{
return rightSum;
}
else
return crossSum;
}
}
public static void main(String[] args)
{
int[] a = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};
int sum = findMaximumSubarray(a, 0, a.length - 1);
System.out.println(sum);
}
}
相关文章推荐
- 算法学习之路:分治策略-最大子数组-java实现
- 第四章 分治策略 4.1 最大子数组问题 (减治法,别人的,拿来看看)
- 《算法导论》学习笔记——最大子数组(分治策略,动态规划)
- 分治策略 | 最大子数组问题
- 分治策略求解子数组最大和并输出下标
- 用递规与分治策略,找出数组中最大元素的位置
- 第四章 分治策略 4.1 最大子数组问题 (暴力求解算法)
- 算法导论:分治策略__最大子数组问题
- 算法导论学习笔记(二)分治策略之最大子数组
- 分治策略之最大子数组问题
- Rhyme/最大子序列和(分治策略)Java版
- 第四章 分治策略 4.1 最大子数组问题(自己想的,不知道是不是减治法)
- 算法导论之分治策略:最大子数组问题
- 分治策略算法之最大字数组和问题
- [置顶] 算法导论学习:分治策略之最大子数组问题
- 分治策略之最大子数组问题
- 分治策略之最大子数组问题
- 第四章 分治策略 4.1 最大子数组问题(自己想的,不知道是不是减治法)
- 分治策略-求最大连续子数组之和
- 分治策略——最大子数组问题