码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-03-10 20:41:11      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:整数   span   题意   int   ext   包含   单位   pre   main   

要求

1.输入一个整形数组,数组里有正数也有负数。

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

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

思路及源代码

  看到要求时,有点读不懂题。我以为是求数组中连续的数的和,比如-1 3 15 6 7 -9里求的是6+7=13,很显然我理解错了,真正题意求的是3+15+6+7=31。

  首先不考虑时间复杂度为O(n),可以使用以下方法求得最大子数组的和。

package test;

import java.util.Scanner;

public class FindMaxArray {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] a = new int[10];
        for(int i=0;i<10;i++)
            a[i] = sc.nextInt();
        sc.close();
        int[] max = new int[10];    //用于存储以对应位置起始的所有子数组和的最大值
        int t;
        for(int i=0;i<10;i++) {
            t=0;
            for(int j=i;j<10;j++) {
                t += a[j];
                if(max[i] < t)
                    max[i] = t;
            }
        }
        t=0;
        for(int i=0;i<10;i++)
            if(t<max[i])
                t=max[i];
        System.out.println(“最大子数组的和为” + t);
    }
}

  本来以为所有最大子数组必定包含最大数,但是后来找到了一组反例,-12 13 -2 -13 3 11 1 -1 1 -1,最大子数组和为3+11+1=15,此时并未包含最大数13。后来发现如果以数块为基本单位,那么最大子数组必定包含最大数块,并且以最大数块为基点左右蔓延(左边负数块加上再左边的正数块大于零则加入最大子数组,右边同理)题目要求时间复杂度为O(n),那么肯定是用到了数块,然而目前还未能想出如何实现数块的运算。

package test;

import java.util.Scanner;

public class FindMaxArray {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] a = new int[10];
        for(int i=0;i<10;i++)
            a[i] = sc.nextInt();
        sc.close();
        int[] b = new int[10];  //负数数块数组
        int[] c = new int[10];  //正数数块数组
        if(a[0]<0)
            b[0] = a[0];
        else
            c[0] = a[0];
        int j=0;
        for(int i=1;i<10;i++) {
            if(a[i]<0 && a[i-1]>0)
                b[++j] = a[i];
            if(a[i]>0 && a[i-1]<0)
                b[++j] = a[i];
            if(a[i]<0 && a[i-1]<0)
                b[j] += a[i];
            if(a[i]>0 && a[i-1]>0)
                b[j] += a[i];
        }
    }
}

  未完待续,以后完善该算法。

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

标签:整数   span   题意   int   ext   包含   单位   pre   main   

原文地址:https://www.cnblogs.com/dream0-0/p/10506548.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!