实现数组中连续子数组值和最大

课堂测试1:


 

 

 

  

   思路:从第二个数开始,如果这个数和上一个数相加,大于目前这个数,则a[i] = a[i] +a[i-1],否则不动,继续下一个。

  判断当前这个节点是否能与前面的节点组成一个更大的连续区间,如果可以就加进去,不能就自己组一个区间;然后遍历整个数组,找出最大的值就是连续区间的最大和(大佬提供的方法)


  代码:

复制代码
package com.testHomework;

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入n值:");
        int n = scanner.nextInt();
        int a[] = new int[n+1];
        for(int i=1;i<=n;i++) {
            a[i] = scanner.nextInt();
        }
        
        for(int i=2;i<=n;i++) {
            if(a[i]<a[i]+a[i-1]) {
                a[i]+=a[i-1];
            }
        }
        int temp = -10000;
        for(int i=1;i<=n;i++) {
            temp = temp<a[i]?a[i]:temp;
        }
        System.out.println("子数组和最大值为:"+temp);
        
    }
    
}
复制代码

 

 运行结果:

  

 

 


 

   

 课堂测试2:在上一个题目条件下实现循环

 


   思路:因为数组是循环的,首尾可以拼接。什么情况下符合条件的子数组需要首尾相连呢——————中间有一段连续子数组,其和为负且绝对值较大。故我们对a[ ]每个元素改变符号后再求最大连续子数组和ans_2。sum为没变之前的数组每个元素的和。原数组去掉中间这段子数组后的值为sum+ans_2。最后答案为max(sum+ans_2,ans_1);

  代码:

复制代码
package daliyTest1;

import java.util.Scanner;

public class CyclicArray {
    public static void main(String[] args) {
        System.out.print("请输入n值:");
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int sum = 0;    // 定义数组总和
        int a[] = new int[n+1];
        int b[] = new int[n+1];  // 定义相反数组
        for(int i=1;i<=n;i++) {
            a[i] = scanner.nextInt();
            sum += a[i];
            b[i] = -a[i];
        }
    
        for(int i=2;i<=n;i++) {
            if(a[i]<a[i]+a[i-1]) {
                a[i]+=a[i-1];
            }
        }
        int ans_1 = -10000;
        // 对数组取最大值
        for(int i=1;i<=n;i++) {
            ans_1 = ans_1<a[i]?a[i]:ans_1;
        }
        
        // 对相反数组取最大值
        for(int i=2;i<=n;i++) {
            if(b[i]<b[i]+b[i-1]) {
                b[i]+=b[i-1];
            }
        }
        int ans_2 = -10000;
        for(int i=1;i<=n;i++) {
            ans_2 = ans_2<b[i]?b[i]:ans_2;
        }
        System.out.println("最大值为:"+(ans_1>(sum+ans_2)?ans_1:(sum+ans_2)));
    }

}
复制代码

  

  运行结果:

posted @ 2021-05-12 17:50  lbjhrzgj  阅读(129)  评论(0编辑  收藏  举报