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

    题目:返回一个整数数组中最大子数组的和

    要求:1、输入一个整形数组,数组里有正数也有负数。

       2、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

       3、求所有子数组的和的最大值。要求时间复杂度为O(n)

    方法一:刚拿到这个题目时,先没有考虑时间复杂度的问题,就是想把所有的子数组的和算出来,然后在比较,思路简单,但循环次数多

    package about_bank_account;
    
    import java.util.Scanner;
    
    public class Test {
        public static void main(String[] args) {
            
            Scanner in = new Scanner(System.in);
            
            int[] A = new int[5];//大数组
            int[] B = new int[15];        
            int temp = 0;
            int i;
            int k;//k为行
            int t1 = 0;//小数组内循环
            int t2 = 0;//记录小数组内数字个数
            int sum = 0;//
            int j = 0;
            int max = 0;
            
            System.out.println("输入5个数:");
            
            for(i = 0;i < 5;i++) {
                temp = in.nextInt();
                A[i] = temp;
            }
            
            for(k = 0;k < 15;k++) {    
                for(t1 = j;t1 <= t2;t1++) {
                    sum = sum + A[t1];
                }
                    
                t2++;
                B[k] = sum;
                sum = 0;
                    
                if(t2 == 5) {
                    j = j + 1;
                    t2 = j;
                }                        
            }
            
            max = B[0];
            for(k = 0;k < 15;k++) {                    
                if(max < B[k]) {
                    max = B[k];
                }
            }
            
            System.out.print("-------------"+max);
        }
    }

    方法二:先将数组转化成一正一负(正负相间)的数组,

      若原数组为:

    5 -1 -2 1 2

      转化后数组为:

    5 -3 3

      然后在转化后的数组的基础上,从第一个数开始,依次加两个数然后比较,加到最后一位数后,再从第二个数开始加,这样循环,找出其中最大数

    (本方法我没有具体实现,转化后数组第一个数字正负不同,加的方式不同)

    方法三:把数组的第一个值付给rmax和max,随后进行循环比较,从正值开始计数,如果一个一个累加起来小于等于零,就将max重新赋值,每次把最大值付给rmax,最后得出子数组的和的最大值。

    package about_bank_account;
    
    import java.util.Scanner;
    
    public class Test {
        
        public static void main (String[] args){
            @SuppressWarnings("resource")
            Scanner in=new Scanner(System.in);
            int num[]=new int[5];
            int max=0;
            int rmax=0;
            System.out.println("请输入五个数:");
            for(int i=0;i<5;i++) {
                num[i]=in.nextInt();
            }
            rmax=num[0];
            for(int i=0;i<5;i++) {
                if(max<=0) {
                    max=num[i];
                }else {
                    max+=num[i];
                }
                if(rmax<max) {
                    rmax=max;
                }
            }
            System.out.println(rmax);     
        }
        
    }

  • 相关阅读:
    codeforces B. Strongly Connected City(dfs水过)
    codeforces A. Bayan Bus(简单模拟)
    AC_Dream 1211 Reactor Cooling
    AC_Dream 1224 Robbers(贪心)
    java中DatagramSocket连续发送多个数据报包时产生丢包现象解决方案
    AC_Dream 1216 G
    java模拟一个简单的QQ
    codeforces D. Design Tutorial: Inverse the Problem
    codeforces B. Design Tutorial: Learn from Life
    codeforce A. Design Tutorial: Learn from Math
  • 原文地址:https://www.cnblogs.com/leity/p/10505566.html
Copyright © 2011-2022 走看看