一个数组,子数组求最大值。
?
一维数组问题
一、求连续的元素的子数组最大值。
首先,问题的要求是:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
我写的代码如下:
import java.util.*; public class Array { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int x, i; int max = 0, lsmax = 0; x = sc.nextInt(); int[] a = new int[x]; for (i = 0; i < a.length; i++) { a[i] = sc.nextInt(); if (i == 0) { lsmax = a[i]; max = lsmax; } else { if (lsmax < 0) { lsmax = a[i]; } else { lsmax += a[i]; } } if (lsmax > max) { max = lsmax; } } System.out.println(max); } }
然后我说一下我的思路,当时上课的时候虽然这个很简单,但是我还是没有想出来。
1.因为是要求所有子数组的情况,所以有都为负数的情况以及其它情况,都为负数的情况就需要单独对比,找出负数里面的最大值。连续的情况就需要一个个相加来对比。
2.因为是第一阶段,所以代码也是比较简单,思路就是创建一个动态数组,然后创建一个用来储存临时最大值的变量lsmax以及最终结果的最大值的变量max,首先判断是否只有一个变量,是的话就是直接输出最大值。然后当超过一个变量的时候就可以判断前两个数的和是否小于0,小于0的话就可以直接舍弃不要了,从当前变量从新来选。最后如果临时最大值大于最终结果,就把临时最大值赋值给最终结果,输出即可。
?