给定一个整数数组(有正有负),找出总和最大连续数列

全局文档编号:1452

一、背景

一个朋友问了我这样一个问题:给定一个整数数组(有正数有负数),例如{-2,1,-3,4,-1,2,1,-5,4},找出总和最大的连续数列,并返回总和。觉得挺有意思,写代码实现了一下。

二、思路故事

类似于逛街买衣服,我们有明确的目标(例如:7分牛仔裤,类比于连续数列和最大),然后一家店一家店比价,比完价格最低的下单完事。

  1. 遍历数组,获取其子数组,并计算和
  2. 不断冒泡,子数组和更大的记录其左右下标
  3. 遍历结束,连续数列和最大结果揭晓

三、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);
    }
}

猜你喜欢

转载自www.cnblogs.com/6da6da/p/12944965.html
今日推荐