zoukankan      html  css  js  c++  java
  • 实现数组中连续子数组值和最大

    课堂测试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)));
        }
    
    }
    复制代码

      

      运行结果:

  • 相关阅读:
    webApp 开发技术要点总结
    前端好难
    webApp前端开发技巧总结
    WAP、触屏版网站及APP的区别
    ajax 200 4 parseerror 的错误
    .Net Windows Service(服务) 调试安装及System.Timers.Timer 使用
    引用:WebAPI中的定时处理-使用Quartz.Net
    Redis 应该是存放的数据超出了范围
    easyui Dialog 去边框
    MSSQL SQL Server代理 作业 设置(调用存储过程)
  • 原文地址:https://www.cnblogs.com/hrzgj/p/14850852.html
Copyright © 2011-2022 走看看