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

要求

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

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

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

一、源代码

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class hello {
    public static void main(String[] args){
        List<Integer> list = new ArrayList<>();
        int sum = Integer.MIN_VALUE;
        int i,max = sum;
        Random random = new Random();
        int length = random.nextInt(5);
        for (i = 0;i < length; i++){
            list.add(random.nextBoolean()?random.nextInt(10):random.nextInt(10) * (-1));
        }
        for (i = 0;i < length; i++){
            System.out.print(list.get(i).intValue()+"   ");
        }
        System.out.println();
        for (i = 0; i < length; i++){
            if (sum < 0){
                sum = list.get(i).intValue();
            }else {
                sum += list.get(i).intValue();
            }
            if (max < sum){
                max = sum;
            }
        }
        System.out.println(max);
    }
}

二、结果截图

 (数组长度和元素都为随机生成)

三、设计思想

  假象一个数组来存子串,将第一个元素加入子串,如果第一个元素是负数,此时子串的和是负数,那么第二个元素加上该子串的和肯定会变小,那么去除子串中的所有元素,将第二个元素加入到子串中,再求和,然后在用该子串和第三个元素进行运算;如果第一个元素是正数,那么此时子串的和是正数,那么第二个元素加上该子串肯定会变大,那么将第二个元素加入子串,再用该子串与第三个元素进行逻辑运算。依次往后类推。

四、出现的问题

  目前采用随机数的方法来生成数组长度和元素,但是随机数我使用的是Random类的nextint(int d)方法,这样会产生[0,d)的随机数,也有可能会产生0,当数组长度为0时便会出现问题。

五、解决方案

  可以使用相关的运算产生不含0的随机数。

六、总结

  该问题如果相通的话不是很难,但是刚开始却纠结于负数等问题,在网上搜索了相关的资料后才有的思路,自己的算法设计能力还是太低了,以后要多多学习相关的思想和知识!

原文地址:https://www.cnblogs.com/wuren-best/p/12366313.html