课堂测试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))); } }
运行结果: