要求:
1、输入一个整形数组,数组里有正数也有负数。
2、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3、求所有子数组的和的最大值。要求时间复杂度为O(n)。
源代码
1 package HomeTest; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.Random; 6 7 public class MaxS { 8 public static void main(String[] args) { 9 List<Integer> list = new ArrayList<>(); 10 int sum = Integer.MIN_VALUE; 11 int i, max = sum; 12 Random random = new Random(); 13 int length = random.nextInt(6); 14 for (i = 0; i < length; i++) { 15 list.add(random.nextBoolean() ? random.nextInt(10) : random.nextInt(10) * (-1)); 16 } 17 for (i = 0; i < length; i++) { 18 System.out.print(list.get(i).intValue() + " "); 19 } 20 System.out.println(); 21 for (i = 0; i < length; i++) { 22 if (sum < 0) { 23 sum = list.get(i).intValue(); 24 } else { 25 sum += list.get(i).intValue(); 26 } 27 if (max < sum) { 28 max = sum; 29 } 30 } 31 System.out.println(max); 32 } 33 }
数组长度与元素利用随机数产生(但是我使用的随机数函数会产生范围在[0,d)之间的随机数,会出现0的情况,当数组长度为0时便会出现bug)
思路
设计一个数组来存子串,将第一个元素加入子串,如果第一个元素是正数,此时子串的和是正数,将第二个元素加入子串,再用该子串与第三个元素相加;如果第一个元素是负数,此时子串的和是负数,那么去除子串中的所有元素,将第二个元素加入到子串中,再求和,然后在用该子串和第三个元素进行运算。依此往后类推。
结果截图
这个问题总体上来说其实并不是太难,但我并没有很快的想出解决方法,最后还是靠网上寻求案例以及在同学的帮助之下解决了问题,我对于算法设计这一方面的知识仍然太薄弱,还是需要提高自己的算法设计能力才行。
原文地址:https://www.cnblogs.com/best-hym/p/12367664.html
时间: 2024-10-08 20:35:06