全局文档编号:1452
一、背景
一个朋友问了我这样一个问题:给定一个整数数组(有正数有负数),例如{-2,1,-3,4,-1,2,1,-5,4},找出总和最大的连续数列,并返回总和。觉得挺有意思,写代码实现了一下。
二、思路故事
类似于逛街买衣服,我们有明确的目标(例如:7分牛仔裤,类比于连续数列和最大),然后一家店一家店比价,比完价格最低的下单完事。
- 遍历数组,获取其子数组,并计算和
- 不断冒泡,子数组和更大的记录其左右下标
- 遍历结束,连续数列和最大结果揭晓
三、Java代码实现
/**
* @author wangyao
* @date 2020-5-11 13:54
* @description:
*/
public class ArrayTest {
public static void main(String[] args) {
/**
* 给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和。
* 示例:
* 输入: [-2,1,-3,4,-1,2,1,-5,4]
* 输出: 6
* 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
*/
int left = 0, right = 0, maxCount = 0, preLeft, preRight, preMaxCount = 0;
Integer[] a = {-2,1,-3,4,-1,2,1,-5,4};
Integer[] targetArray = {};
for (int i = 0; i < a.length; i++) {
for (int j = i; j < a.length; j++ ) {
preLeft = i;
preRight = j;
Integer[] childArray = Arrays.copyOfRange(a, i , j);
preMaxCount = Arrays.asList(childArray).stream().mapToInt(value -> value).sum();
if (preMaxCount > maxCount) {
left = preLeft;
right = preRight;
maxCount = preMaxCount;
targetArray = childArray;
}
}
}
System.out.println(left + "," + (right-1));
System.out.print("符合条件的连续子数组为:");
Arrays.asList(targetArray).stream().forEach(integer -> System.out.print(integer.intValue() + ","));
System.out.print("最大值" + maxCount);
}
}