一:返回一个整数数组中最大数组的和,首尾不可以相连,即非环状数组
要求:输入一个整形的数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组的和的最大值,要求时间复杂度为O(n);
思路:动态规划
1.指定数组的容量
2.输入数组
3.计算子数组,从第一个数开始做加法,若第一个数大于第二个数,则继续加下一个数,若加上第二个数的值大于第三个数,就重复此此操作,若是小于第三个数,则舍弃前面所有的数,并从开始重复之前的操作。
源代码:
package java_study; import java.util.Scanner; public class array { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner=new Scanner(System.in); System.out.println("请输入数字的数量:"); int n=scanner.nextInt();//输入数组的个数 int[] a=new int[n]; System.out.println("请输入数组的数值:"); for(int i=0;i<n;i++) {//循环输入数组的值 a[i]=scanner.nextInt(); } for(int i=1;i<n;i++) { if(a[i]+a[i-1]>a[i]) a[i]=a[i]+a[i-1];//从开始累加,进行思路3中的步骤,比较大小 } int ans=-1000; for(int i=0;i<n;i++) { if(a[i]>ans) ans=a[i];//找取最大值 } System.out.println(ans); } }
测试截图:
二:返回一个整数数组中最大数组的和,首尾可以相连,即环形数组
错误思路:
1.因为是首尾可以相连,所以可以定义一个是2倍大的数组,重复将之前的数组写下来
2.然后进行之前的操作,但是这里求出来,会出现错误的部分,原因是对数组进行了重复的使用
正确思路:
1.在第一种的非环形数组的动态规划思想的基础上,要想可以循环,可以将一个n容量的数据,根据数字的开头选择可以转换成n种不同的数组
例如:数组 1 2 3 4 可以转换成不同的2 3 4 1 3 4 1 2 4 1 2 3
2.然后运用非环形的思路,计算出各个子数组之和的最大值
3.找出步骤2中的最大值即可
源代码:
package java_study; import java.util.Scanner; public class array { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner=new Scanner(System.in); System.out.println("请输入数字的数量:"); int n=scanner.nextInt();//输入数组的个数 int[] a=new int[n]; System.out.println("请输入数组的数值:"); int m=-1000000; for(int i=0;i<n;i++) { a[i]=scanner.nextInt(); } for(int i=1;i<=n;i++) { int[] b=new int[n]; for(int j=0;j<n;j++) { b[j]=a[(i+j)%n];//让不同的数组开头,形成不同的字符数组 } m=max(arraymax(b,n),m);//调用max函数,取出最大数值 } System.out.println(m); } public static int arraymax(int[] a,int count) { for(int i=1;i<count;i++) { if(a[i]+a[i-1]>a[i]) a[i]=a[i]+a[i-1];//根据非环状数组的动态规划的思想,计算出每个数组的连续子数组之和的最大值 } int ans=-10000; for(int i=0;i<count;i++) { ans=max(ans,a[i]); } return ans; } public static int max(int ans,int i) {//计算两者的最大值 if(ans>i) return ans; else return i; } }
代码截图:
总结:
在这个不同的题中,主要的思想是运用非环状数组的动态规划问题,解决环状数组的相关问题,其主要的思路就是,可以不一个数组,根据不同的开头转换成不同的数组,然后调用非环状数组动态规划思想,最后求出最大值。