zoukankan      html  css  js  c++  java
  • 返回一个整数数组中最大数组的和(首尾可以/不可以相连)

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

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

    思路:动态规划

    1.指定数组的容量

    2.输入数组

    3.计算子数组,从第一个数开始做加法,若第一个数大于第二个数,则继续加下一个数,若加上第二个数的值大于第三个数,就重复此此操作,若是小于第三个数,则舍弃前面所有的数,并从开始重复之前的操作。

    源代码:

    package java_study;
    
    import java.util.Scanner;
    
    public class array {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            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];//从开始累加,进行思路3中的步骤,比较大小
            }
            
            int ans=-1000;
            for(int i=0;i<n;i++)
            {
                if(a[i]>ans)
                    ans=a[i];//找取最大值
            }
            System.out.println(ans);
        }
    
    }

    测试截图:

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

    错误思路:

    1.因为是首尾可以相连,所以可以定义一个是2倍大的数组,重复将之前的数组写下来

    2.然后进行之前的操作,但是这里求出来,会出现错误的部分,原因是对数组进行了重复的使用

    正确思路:

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

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

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

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

    源代码:

    package java_study;
    
    import java.util.Scanner;
    
    public class array {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            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);//调用max函数,取出最大数值
          }
          
          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;
           }
        }

    代码截图:

    总结:

           在这个不同的题中,主要的思想是运用非环状数组的动态规划问题,解决环状数组的相关问题,其主要的思路就是,可以不一个数组,根据不同的开头转换成不同的数组,然后调用非环状数组动态规划思想,最后求出最大值。

  • 相关阅读:
    使用 ASP.NET Core MVC 创建 Web API(五)
    使用 ASP.NET Core MVC 创建 Web API(四)
    使用 ASP.NET Core MVC 创建 Web API(三)
    使用 ASP.NET Core MVC 创建 Web API(二)
    使用 ASP.NET Core MVC 创建 Web API(一)
    学习ASP.NET Core Razor 编程系列十九——分页
    学习ASP.NET Core Razor 编程系列十八——并发解决方案
    一个屌丝程序猿的人生(九十八)
    一个屌丝程序猿的人生(九十七)
    一个屌丝程序猿的人生(九十五)
  • 原文地址:https://www.cnblogs.com/hhjing/p/12368622.html
Copyright © 2011-2022 走看看