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

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

作者: 牙齿不帅 | 来源:发表于2020-06-01 20:13 被阅读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]);
        }
    
    }
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/hztezhtx.html