如何输出元素和最大的最长连续序列?Java代码优化求助
解决最大和连续子序列的最长匹配问题
原代码仅在子序列和更大时更新结果,未处理和相等但长度更长的场景。我们需要修改判断逻辑,在和相等时比较子序列长度,保留更长的那个。
修改后的代码
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(-5); list.add(6); list.add(-3); list.add(-13434); list.add(99); list.add(99); list.add(-444); list.add(-7444); list.add(100); list.add(90); list.add(8); if (list == null || list.size() == 0) { System.out.println("empty array"); return; } int maxSumStartIndex = 0; int maxSumLastIndex = 0; int maxSum = list.get(0); // 记录当前最大子序列的长度 int maxLength = maxSumLastIndex - maxSumStartIndex + 1; int lastSumStartIndex = 0; int lastSum = list.get(0); for (int i = 1; i < list.size(); i++) { lastSum += list.get(i); if (lastSum < list.get(i)) { lastSum = list.get(i); lastSumStartIndex = i; } // 计算当前子序列长度 int currentLength = i - lastSumStartIndex + 1; // 修改判断逻辑:要么和更大,要么和相等但长度更长 if (lastSum > maxSum || (lastSum == maxSum && currentLength > maxLength)) { maxSumStartIndex = lastSumStartIndex; maxSumLastIndex = i; maxSum = lastSum; maxLength = currentLength; } } System.out.println("sum( arr[" + maxSumStartIndex + "] .. arr[" + maxSumLastIndex + "] ) = " + maxSum); for (int i = maxSumStartIndex; i <= maxSumLastIndex; i++) { System.out.print(list.get(i) + " "); } } }
关键修改说明
- 新增
maxLength变量,跟踪当前最大和子序列的长度,初始值为第一个元素的长度(1)。 - 循环中计算当前子序列的长度
currentLength,用于和maxLength对比。 - 更新判断条件:
- 当当前子序列和大于已记录的最大和时,直接更新结果(和原逻辑一致)。
- 当和相等时,若当前子序列长度更长,则替换原有结果,更新索引和长度。
运行后会输出预期的100 90 8——它的和(198)与99,99的和相同,但长度(3)更长。
内容的提问来源于stack exchange,提问作者vegaLDN
相关产品推荐
相关产品推荐

