连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数。数组中一个或 连续 的多个整
数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n)。 例
如输入的数组为{1, -2,3,10, -4,7,2, -5},和最大的子数组为{3,10, -4,7,2}。
思路:
该方法的时间复杂度比较大,抛去时间复杂度条件,最笨的方法,就是遍历所有子数组的元素和,然后存到
一个字符串容器中,将字符串容器中的每个连续子数组的元素和取出来放到定义的整型数组中,求其中最大值
题目:输入一个整型数组,数组里有正数也有负数。数组中一个或 连续 的多个整
数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n)。 例
如输入的数组为{1, -2,3,10, -4,7,2, -5},和最大的子数组为{3,10, -4,7,2}。
思路:
该方法的时间复杂度比较大,抛去时间复杂度条件,最笨的方法,就是遍历所有子数组的元素和,然后存到
一个字符串容器中,将字符串容器中的每个连续子数组的元素和取出来放到定义的整型数组中,求其中最大值
变式:返回子数组中所有元素的和最大值对应的子数组
方法一:
public class SubStringMaxSum_1 {
public static void main(String[] args){
int [] b = {1,-2,3,10,-4,7,2,-5};
int c=subStringMaxSum(b);
System.out.println(c);
}
public static int subStringMaxSum(int[] arr) throws RuntimeException
{
if(arr==null || arr.length==0)
return 0;
//int len=arr.length;
//这里len*len指的是连续子数组总数目,若用数组容器,则必须得知道数组长度,
//若定义的长度小于要存储的元素总个数,则会溢出,反之,则多余的长度对应的元素初始化为0,当存储元素都为负数,则返回最大值为0,不符合题意。
//int[] a=new int[len*len];
//int n=0;
StringBuilder sb= new StringBuilder();
int end=arr.length;
//该循环控制连续子数组的个数
for(int m=0;m<end;end--){
//该循环控制每个子数组
for(int i=0;i<end;i++){
int sum=0;
//该循环控制每个子数组所有元素的和
for(int j=i;j<end;j++){
sum+=arr[j];
}
//用数组容器来存储
//a[n]=sum;
//n++;
sb.append(sum+" ");//思路类似day6_24中的AdjustArrayElementOddEvenOrder_1
}
}
String str1 = new String(sb);
String [] str2 =str1.split(" ");
int[] b = new int[str2.length];
for(int y=0;y<str2.length;y++){
b[y]=Integer.parseInt(str2[y]);
}
for(int k=1;k<b.length;k++)//可以Arrays.sort(b),然后System.out.println("max:"+b[b.length-1]);
{
if(b[0]<b[k])
b[0]=b[k];
}
return b[0];
}
}
方法二:
public class SubStringMaxSum_2 {
public static void main(String[] args) {
//SubStringMaxSum_2 p=new SubStringMaxSum_2();
int[] array={1,-2,3,10,-4,7,2,-5};
int a = findSubArrayMax(array);
System.out.println(a);
}
public static int findSubArrayMax(int[] arr){
int sum=0;
int currentSum=0;
int maxSum=0;
for(int i=0;i<arr.length;i++){
//currentSum=sum+currentSum;
if(currentSum<=0)
currentSum=arr[i];
else
currentSum+=arr[i];
if(maxSum<=currentSum)
maxSum=currentSum;
//sum=0;
}
return maxSum;
}
}