連續子數組的最大和


連續子數組的最大和
 題目:輸入一個整型數組,數組里有正數也有負數。數組中一個或     連續   的多個整
 數組成一個子數組。求所有子數組的和的最大值。要求時間復雜度為 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;
}


}



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: