课堂测试1

题目:返回一个整数数组中最大子数组的和。

要求: 输入一个整形数组,数组里有正数也有负数。

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

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

 

 

我的代码:

  

public class OneTest {
public static void main(String[] args) {
Scanner x = new Scanner(System.in);
while (x.hasNext()) {
int m = x.nextInt();
int[] number = new int[m];
for (int i = 0; i < m; i++) {
number[i] = x.nextInt();
}
int sum1, temp = 0;
sum1 = number[0];
for (int i = 0; i <= m; i++) {
for (int j = i; j <= m; j++) {
temp = 0;
int newArray[] = Arrays.copyOfRange(number, i, j);
for (int t : newArray) {
temp += t;
}
if (temp > sum1) sum1 = temp;
}
}
System.out.println(sum1);
}
}
利用两个for循环,计算出每个子数组的值一次比较,得到最大值再打印,但是时间复杂度为O(n^2)


别人的代码:
public void TwoTest(){
Scanner x =new Scanner(System.in);
int m = x.nextInt();
int[] number = new int[m];
for (int i = 0; i < m; i++) {
number[i] = x.nextInt();
}
int sum = 0;
int maxA=-2147483648;
for (int i = 0;i<m;i++){
sum+=number[i];
maxA=max(maxA,sum);
if(sum<0)sum=0;
}
System.out.println(maxA);
}

private int max(int maxA, int sum) {

if(maxA>sum){
return maxA;
}
else return sum;
}

此方法较比我的方法更简便,时间复杂度为O(n)。
此方法是按顺序算出子数组的和,当sum>0时,说明前面的子数组是在增大,当sum<0时,说明前面的子数组之和加上后面的数会变小所以前面的子数组得舍弃。


posted @ 2022-03-11 20:18  Blue啊  阅读(20)  评论(0)    收藏  举报