• 返回一个整数组中的最大子数组的和


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

    要求: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);
        }
    }

    第二种就是首先将数组中的值给最大值,并当累加值小于0时就不在累加,而是将数组的值赋值给累加值,并将累加值与最大值进行比较。这样当数组为纯负数的时候就相当于对数组中的值进行比较。

    package test;
    
    import java.util.Scanner;
    /*
     * 求子数组的最大值
     */
    public class shuzu {
    static Scanner in = new Scanner(System.in);
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
            int num[] = new int[100];
            int n;
            int sum = 0;
            int value = 0;
            
            System.out.println("输入数组的个数");
            n = in.nextInt();
            System.out.println("输入数组中的值");
            for(int i = 0;i < n;i++)
            {
                num[i] = in.nextInt();
            }
            sum = num[0];
            
            
            
            for(int i = 0;i < n;i++)
            {
                if (value <= 0) {
                    value = num[i];   //当用于记录的值小于等于0时就无需对其进行相加了,此时就等于下一个值
                }else {
                    value += num[i];  //当value的值仍大于0时就继续相加
                }
                
                if (sum < value) {    //用sum等于子数组的最大值,若value的值大于sum的值,则将value赋值给sum
                    sum = value;
                }
            }
            
            System.out.println("最大值为:" + sum);
    
        }
    
    }
  • 相关阅读:
    codevs 1199 开车旅行 2012年NOIP全国联赛提高组
    poj 3349 Snowflake Snow Snowflakes
    poj 3264 Balanced Lineup
    求二进制数中1的个数
    20个正则表达式,减少千行代码
    推流脚本
    Navicat 管理工具下载地址,破解版
    emoji表情处理研究
    计算机网络学习
    tcp/ip 学习-通过视频学习
  • 原文地址:https://www.cnblogs.com/adret/p/10507918.html
Copyright © 2020-2023  润新知