要求:
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的随机数。
六、总结
该问题如果相通的话不是很难,但是刚开始却纠结于负数等问题,在网上搜索了相关的资料后才有的思路,自己的算法设计能力还是太低了,以后要多多学习相关的思想和知识!