zoukankan      html  css  js  c++  java
  • 返回一个整数数组中最大数组的和

    一:返回一个整数数组中最大数组的和,首尾不可以相连,即非环状数组

    要求:输入一个整形的数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组的和的最大值,要求时间复杂度为O(n);

    import java.util.Scanner;
    
    public class array {
    
        public static void main(String[] args) {
            
            Scanner scanner=new Scanner(System.in);
            System.out.println("请输入数字的数量:");
            int n=scanner.nextInt();//输入数组的个数
            int[] a=new int[n];
            System.out.println("请输入数组的数值:");
            for(int i=0;i<n;i++)
            {//循环输入数组的值
                a[i]=scanner.nextInt();
            }
            for(int i=1;i<n;i++)
            {
                if(a[i]+a[i-1]>a[i])
                    a[i]=a[i]+a[i-1];
            }
            
            int ans=-1000;
            for(int i=0;i<n;i++)
            {
                if(a[i]>ans)
                    ans=a[i];//找取最大值
            }
            System.out.println(ans);
        }
    
    }

    二:返回一个整数数组中最大数组的和,首尾可以相连,即环形数组

    1.在第一种的非环形数组的动态规划思想的基础上,要想可以循环,可以将一个n容量的数据,根据数字的开头选择可以转换成n种不同的数组

       例如:数组  1 2 3 4    可以转换成不同的2 3 4 1        3 4 1 2      4 1 2 3

    2.然后运用非环形的思路,计算出各个子数组之和的最大值

    3.找出步骤2中的最大值即可

    import java.util.Scanner;
    
    public class array {
    
        public static void main(String[] args) {
            Scanner scanner=new Scanner(System.in);
            System.out.println("请输入数字的数量:");
            int n=scanner.nextInt();//输入数组的个数
            int[] a=new int[n];
            System.out.println("请输入数组的数值:");
            int m=-1000000;
            
            for(int i=0;i<n;i++) {
                  a[i]=scanner.nextInt();
              }
            
          for(int i=1;i<=n;i++) 
          {
              int[] b=new int[n];
              for(int j=0;j<n;j++)
              {
                  b[j]=a[(i+j)%n];//让不同的数组开头,形成不同的字符数组
              }
              m=max(arraymax(b,n),m);
          }
          
          System.out.println(m);
        }
        
        
           public static int arraymax(int[] a,int count)
           {
                  for(int i=1;i<count;i++)
                      {
                          if(a[i]+a[i-1]>a[i])
                          a[i]=a[i]+a[i-1];
                      }
            int ans=-10000;
            for(int i=0;i<count;i++)
            {
               ans=max(ans,a[i]);
            }
            return ans;
          }
           
           
           
           public static int max(int ans,int i)
           {//计算两者的最大值
               if(ans>i)
                   return ans;
               else
                   return i;
           }
        }

  • 相关阅读:
    【ABAP系列】SAP 系统的消息类型分析 MESSAGE TYPE
    【FICO系列】SAP FICO-模块 关于固定资产年结和折旧的问题
    【ABAP系列】SAP ABAP 刷新SCREEN的方法
    【ABAP系列】SAP ABAP 控制ALV单元格编辑后获取新的数值
    【ABAP系列】SAP ABAP系统变量及注释
    【EWM系列】SAP EWM凭证对象表概览
    【EWM系列】SAP EWM中仓库任务WT创建的函数
    教你快速录制gif动图
    阿里巴巴的26款超神Java开源项目!
    HTTP和HTTPS协议,看一篇就够了
  • 原文地址:https://www.cnblogs.com/1234yyf/p/12378011.html
Copyright © 2011-2022 走看看