前提:新手最能理解新手~~。
一、暴力遍历。
核心思想:暴力遍历每一个子数组从而找到最大的直 时间复杂度经过优化的为O(n²)。设置两个和 sum和thissum,sum里面永远存放最大值,thissum存放阶段性和。只有当thissum大于sum才将其交换。
public class 练习题5 {
//最大子数组遍历版
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int arr[]= {1,3,-2,4,-2,5};
int sum =0;
int x=arr.length;
int bexti=0;int bextj=0;
for(int i=0;i<x;i++) {
int thissum=0;
for(int j=i;j<x;j++) {
thissum+=arr[j];
if(thissum>sum) {
sum=thissum;
bexti=i;//最大子数组的起始点
bextj=j;//最大子数组的结束点
}
}
}
System.out.println(sum+" "+bexti+" "+bextj);
}
}
二、分而治之的思想。
核心思想:1.分解问题,将一个大问题分解为若干个小问题。(小问题必须相互独立)
2.解决若干个小问题,递归的方法。(重复,变化,边界)。
3.合并小问题的结果。
import java.util.Scanner;
public class 练习题7 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int N =sc.nextInt();
int arr[]=new int[N];
for(int i=0;i<N;i++) {
arr[i]=sc.nextInt();
}
int max= maxSum(arr,0,N-1);
System.out.println(max);
}
public static int maxSum(int arr[],int left,int right) {
int sum=0;
if(left==right) {sum=arr[left]>0?arr[left]:0;}
else{
int center=(left+right)/2;
int leftsum=maxSum(arr,left,center);//递归左边
int rightsum=maxSum(arr,center+1,right);//递归右边
//合并
int s1=0;int lefts=0;
for(int i=center;i>=left;i--) {
lefts+=arr[i];
if(lefts>s1)s1=lefts;
}
int s2=0;int rights=0;
for(int i=center+1;i<=right;i++) {
rights+=arr[i];
if(rights>s2)s2=rights;
}
sum=s1+s2;
if(sum<leftsum)sum=leftsum;
if(sum<rightsum)sum=rightsum;
}
return sum;
}
}