题目:使用如下思想为最大子数组问题设计一个非递归的、线性时间的算法、从数组的左边界开始,右左至右处理,记录最大子数组
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 + "]");
}
}
------------------------------------------------------------------------------------------------苦难不是博得同情的资本,唯有不断奋斗才能改变命运!
本文介绍了一种求解最大子数组和问题的非递归线性时间算法,并通过Java代码实现了该算法。该算法从数组左边界开始,逐个元素处理并记录当前最大子数组的和及其边界。

4866

被折叠的 条评论
为什么被折叠?



