算法导论书,page41,最大子数组,java代码实现
来源:互联网 发布:克克mp3录音软件 编辑:程序博客网 时间:2024/05/16 19:31
代码的详细解释可以参考书。注意findMaxCrossingSubarray函数,findMaximumSubArray函数返回的是一个对象,所以我们得提前定义一个SubArray 对象,考虑到封装性,将其成员变量设置为私有,并且添加有参构造函数,以及set,get方法。
public class SubArray {
private int low;
private int high;
private int sum;
public SubArray(int low, int high, int sum) {
super();
this.low = low;
this.high = high;
this.sum = sum;
}
public int getHigh() {
return high;
}
public void setHigh(int high) {
this.high = high;
}
public int getLow() {
return low;
}
public void setLow(int low) {
this.low = low;
}
public int getSum() {
return sum;
}
public void setSum(int sum) {
this.sum = sum;
}
}
而后2个函数就是书上的伪代码,注意maxLeft变量和maxRight变量用之前要初始化
下面是完整代码
import java.util.Arrays;
public class FindMaximumSubArray {
public static SubArray findMaxCrossingSubarray(int[] arr,int low,int mid,int high){
int leftSum = Integer.MIN_VALUE;
int sum = 0;
int maxLeft = 0;//
for(int i = mid;i >= 0;i--){
sum += arr[i];
if(sum > leftSum){
leftSum = sum;
maxLeft = i;
}
}
int rightSum = Integer.MIN_VALUE;
int maxRight = 0;//
sum = 0;
for(int j = mid + 1;j <= high;j++){
sum += arr[j];
if(sum > rightSum){
rightSum = sum;
maxRight = j;
}
}
return new SubArray(maxLeft,maxRight,leftSum + rightSum);
}
public static SubArray findMaximumSubArray(int[] array, int low, int high) {
if (low == high) {
return new SubArray(low, high, array[low]);
} else {
int mid = (low + high) / 2;
SubArray subArrayLeft = findMaximumSubArray(array, low, mid);
SubArray subArrayRight = findMaximumSubArray(array, mid + 1, high);
SubArray subArrayCross = findMaxCrossingSubarray(array, low, mid, high);
if (subArrayLeft.getSum() > subArrayRight.getSum() && subArrayLeft.getSum() > subArrayCross.getSum()) {
return subArrayLeft;
} else if (subArrayRight.getSum() > subArrayLeft.getSum() && subArrayRight.getSum() > subArrayCross.getSum()) {
return subArrayRight;
} else {
return subArrayCross;
}
}
}
public static void main(String[] args) {
int[] array = { 8,-5,6,17,29,-36 };
SubArray subArray = findMaximumSubArray(array, 0, array.length - 1);
for(int i = subArray.getLow();i <= subArray.getHigh();i++){
System.out.print(array[i] + " ");
}
}
}
欢迎指证
- 算法导论书,page41,最大子数组,java代码实现
- Java实现《算法导论》最大子数组问题
- 算法导论—最大子数组C/C++实现
- 《算法导论》中求最大子数组的C++实现
- 算法导论之最大子数组问题 C语言实现
- Java算法实现之最大子数组
- [算法导论]分治法---最大子数组
- 算法导论之最大子数组问题
- 算法导论寻找最大子数组
- 算法导论2-最大子数组
- 算法导论,分治策略,最大子数组
- 【算法导论】最大子数组问题
- 算法导论 - 最大和连续子数组
- 算法导论--最大子数组问题
- 算法导论—最大子数组问题
- 【算法导论】求最大子数组
- 算法导论——最大子数组
- 算法导论之寻找最大子数组
- Tegra(ubuntu)调用摄像头V4L2,并用YUV转RGB
- unity3d两种播放视频的方式
- 第 1 章 开始学习 CSS,为网页添加样式
- 基于systemd系统LXC学习
- USB key身份认证介绍
- 算法导论书,page41,最大子数组,java代码实现
- Worker Pools
- 使用screen创建窗口
- Java普通类中获得Spring管理的类
- HDU1081
- spring-模板设计模式
- iOS黑魔法-Method Swizzling
- 谈谈安装MYSQL ODBC遇到的报错(Error 1918)
- 键值对应列表