实现数组中连续子数组值和最大
课堂测试1:

思路:从第二个数开始,如果这个数和上一个数相加,大于目前这个数,则a[i] = a[i] +a[i-1],否则不动,继续下一个。
判断当前这个节点是否能与前面的节点组成一个更大的连续区间,如果可以就加进去,不能就自己组一个区间;然后遍历整个数组,找出最大的值就是连续区间的最大和(大佬提供的方法)
代码:
package com.testHomework;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入n值:");
int n = scanner.nextInt();
int a[] = new int[n+1];
for(int i=1;i<=n;i++) {
a[i] = scanner.nextInt();
}
for(int i=2;i<=n;i++) {
if(a[i]<a[i]+a[i-1]) {
a[i]+=a[i-1];
}
}
int temp = -10000;
for(int i=1;i<=n;i++) {
temp = temp<a[i]?a[i]:temp;
}
System.out.println("子数组和最大值为:"+temp);
}
}
运行结果:

课堂测试2:在上一个题目条件下实现循环
思路:因为数组是循环的,首尾可以拼接。什么情况下符合条件的子数组需要首尾相连呢——————中间有一段连续子数组,其和为负且绝对值较大。故我们对a[ ]每个元素改变符号后再求最大连续子数组和ans_2。sum为没变之前的数组每个元素的和。原数组去掉中间这段子数组后的值为sum+ans_2。最后答案为max(sum+ans_2,ans_1);
代码:
package daliyTest1;
import java.util.Scanner;
public class CyclicArray {
public static void main(String[] args) {
System.out.print("请输入n值:");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int sum = 0; // 定义数组总和
int a[] = new int[n+1];
int b[] = new int[n+1]; // 定义相反数组
for(int i=1;i<=n;i++) {
a[i] = scanner.nextInt();
sum += a[i];
b[i] = -a[i];
}
for(int i=2;i<=n;i++) {
if(a[i]<a[i]+a[i-1]) {
a[i]+=a[i-1];
}
}
int ans_1 = -10000;
// 对数组取最大值
for(int i=1;i<=n;i++) {
ans_1 = ans_1<a[i]?a[i]:ans_1;
}
// 对相反数组取最大值
for(int i=2;i<=n;i++) {
if(b[i]<b[i]+b[i-1]) {
b[i]+=b[i-1];
}
}
int ans_2 = -10000;
for(int i=1;i<=n;i++) {
ans_2 = ans_2<b[i]?b[i]:ans_2;
}
System.out.println("最大值为:"+(ans_1>(sum+ans_2)?ans_1:(sum+ans_2)));
}
}
运行结果:


浙公网安备 33010602011771号