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

        

         对于这个题目,我的第一想法是将所有的子数组都计算出来,然后取其中最大值。这个思路很简单,但是!题目限制了时间复杂度为O(n),而这个思路的时间复杂度为O(n²),所以需要更加简便的算法。

    来分析一下题目,若想子数组的和最大,就要确保第i个数和第i+1个数的和要大于第i+1个数。如果将a[i]作为子数组的最后一位,满足第i-1位和第i位的和大于第i位就相加。if(a[i]+a[i-1]>a[i])  a[i]=a[i]+a[i-1];

    呢么就能满足时间复杂度为O(n)。代码如下:

    package test;
    
    import java.util.Scanner;
    
    public class Test {
        
        public static void main(String[] args) {
            
            @SuppressWarnings("resource")
            Scanner cin=new Scanner(System.in);
            int i,n;
            int[] a=new int[100];
            n=cin.nextInt();
            for(i=1;i<=n;i++)
                a[i] = cin.nextInt();
            for(i=2;i<=n;i++)
            {
                if(a[i]+a[i-1]>a[i])
                    a[i]=a[i]+a[i-1];
            }
            int ans=-100000;
            for(i=1;i<=n;i++)
                ans=max(ans,a[i]);
            System.out.println(ans);
            
            
        }
    
        private static int max(int ans, int i) {
            if(ans>i)
            return ans;
            if(i>ans){
                return i;
            }
            return i;
        }
    
    }

    运行截图:

    如果数组是循环数组呢,时间复杂度为O(n)的我暂时没想出来。不过其他方法倒是可行,比如将所有的子数组的和计算出来取最大值。

    package test;
    import java.util.Scanner;
    public class Test2 {
     public static void main(String args[]) {
    
         System.out.println("输入数字个数");
         Scanner cin= new Scanner(System.in);
         int n = cin.nextInt();
         int[] a=new int[2*n];
         System.out.println("输入数值");
         for(int i = 0;i < n;i++) {
          a[i] = cin.nextInt();
         }
         for(int i = n;i < n*2; i++) {
          a[i] = a[i-n];
         }
         for(int i=2;i<=n;i++)
            {
                if(a[i]+a[i-1]>a[i])
                    a[i]=a[i]+a[i-1];
            }
            int ans=-100000;
            for(int i=1;i<=n;i++)
                ans=max(ans,a[i]);
            System.out.println(ans);
    
     }
        private static int max(int ans, int i) {
            if(ans>i)
            return ans;
            if(i>ans){
                return i;
            }
            return i;
        }
    }

    运行截图:

  • 相关阅读:
    vue.nextTick()方法简单理解
    vue中 hash和history的区别
    Set,Map一些常见的遍历方法以及转化方法
    vue中import和require的用法
    $route和 $router的区别是什么
    vue vmodel的总结
    vue router的钩子函数总结
    了解promise和async await的区别
    ZOJ 1642 Match for Bonus
    UVA 10003 Cutting Sticks
  • 原文地址:https://www.cnblogs.com/wendi/p/12369275.html
Copyright © 2011-2022 走看看