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


     课堂测试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)));
        }
    
    }

      

      运行结果:

  • 相关阅读:
    logistics regression
    dir 以及 attrib
    python 爬取有道翻译
    spss 逐步回归
    JQuery传值给.ashx乱码
    字符串转换成json的三种方式
    启动数据库SQL Server Service Broker
    ASP.NET两种缓存方式
    VS安装控件后报错
    sql server中有不是全数字的字符串
  • 原文地址:https://www.cnblogs.com/yangxiao-/p/12366328.html
Copyright © 2020-2023  润新知