JAVA笔试题:算出一个数组中"和"最大的子数组,不可调用Jav

2020-06-01  本文已影响0人  牙齿不帅
package com;

public class Test {

    /**
     * 获取数组中【和】最大的子数组
     * 思路:
     * 从左往右开始,不断的累加数据,一旦累加的【和】达到一个新的【最大峰值】的时候记录一下此时的【结束位置】。
     * 如果累加的和小于【1】,那么就寻找【下一个】最大的子数组,所以开始的时候负数直接【跳过】。
     * 可能有【多个】子数组,每完成一个子数组都要与之前的比较,得出和【最大】的那一个。
     * @param args
     */
    public static void main(String[] args) {
        int arr[] = { 1, 2, 3, -1, -2, -6, -7, 8, -1, -2, -3, 10, 12, 1, -1, -2, -3, 4, 5, 6, 23, 234 };
        int max = 0;
        int total = 0;
        int lastMax = 0;

        int lastStart = -1;
        int start = -1;
        int end = -1;
        for (int i = 0; i < arr.length; i++) {
            int a = arr[i];
            // 如果从左面开始都是负数,那么就都跳过
            if (total == 0) {
                if (a < 0) {
                    continue;
                }
            }
            // 如果没有开始位置,那就从不是负数的开始吧
            if (start < 0) {
                start = i + 1;
            }
            // 累加
            total += a;
//          如果累加大于累加的最大值,那么就有了新的最大值
            if (total > max) {
                max = total;
                // 如果最大值大于上一次记录的最大值,说明又有新的峰值了
                if (max > lastMax) {
                    end = i + 1;
                    // 更新最大值
                    lastMax = max;
                    lastStart = start;
                }
            }
//          如果由于负数的累加,导致回到了小于1的状态,那么就要寻找下一个峰值了
            if (total < 1) {
                total = 0;
                max = 0;
                lastStart = start;
                // 开始新的
                start = -1;
            }
        }
        /**
         * 打印最大子数组的和,子数组【开始】和【结束】的位置和数值,
         */
        System.out.println(lastMax);
        System.out.println(lastStart + ":" + arr[lastStart - 1]);
        System.out.println(end + ":" + arr[end - 1]);
    }

}
上一篇下一篇

猜你喜欢

热点阅读