关于返回一个整数数组中最大子数组的和的问题

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

要求: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-212

 

 

  转化后数组为:

5-33

 

 

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

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

方法三:把数组的第一个值付给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);     
    }
    
}

 

转载于:https://www.cnblogs.com/leity/p/10505566.html

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值