您的位置:首页 > 其它

算法导论--第四章--练习4.1-5

2014-05-24 16:19 183 查看
题目:使用如下思想为最大子数组问题设计一个非递归的、线性时间的算法、从数组的左边界开始,右左至右处理,记录最大子数组

public class Find_Max_SubArray {

public static void main(String[] args) {
int A[] = { -12, 12, 12, -2, 12, -120, 120 , 123 ,-1230 };
Find_Max_SubArray(A);
}

public static void Find_Max_SubArray(int A[]) {
// 记录相加的和
int sum = 0;
// 记录最大值
int max = 0;
// 记录最大子数组左下标
int indexLeft = 0;
// 记录最大子数组右下标
int indexRight = 0;
// 用来标记tempsum是否重新初始化
int mark = 0;
// 用来记录左下标加了多少次
int tempSum = 0;

for (int i = 0; i < A.length; i++) {
sum += A[i];

// 如果sum<0,说明A[i,j]这段已经没有继续加的必要,
if (sum < 0) {
// 重新初始化sum
sum = 0;
// mark=1,让tempsum重新计数
mark = 1;
} else {
if (sum > max) {
// 将最新的最大值赋予max
max = sum;
// 记录数组右下标
indexRight = i;
// 判断tempsum是否需要重新计数
if (mark == 1) {
tempSum = -1;
mark = 0;
}
tempSum++;
}

}
}
// 算出数组做下标
indexLeft = indexRight - tempSum;
System.out.print("最大子数组和为" + max + ",下标[" + indexLeft + ","
+ indexRight + "]");
}

}


------------------------------------------------------------------------------------------------苦难不是博得同情的资本,唯有不断奋斗才能改变命运!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: