給定n(1<=n<=100000)個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為: max,1<=i<=j<=n。 例如,當(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)時,最大子段和為20.
第一種 暴力求解 最費時 時間複雜度o(n^3)
int maxsum(int a,int n)
}return maxsum;
}
第二種 在第一種上的改進版 時間複雜度o(n^2)
int maxsum(int a,int n)
}return maxsum;
}
第三種 分而治之 遞迴思想
將陣列一分為二,左邊右邊,整個陣列最大的和可能是左半邊最大和 也可能是右半邊最大和 還有可能是跨越邊界最大和 , 分別求出來 ,在比較大小。時間複雜度o(nlogn)
int max(int a,int left,int right)
sum = 0;
right_max = 0;
for(i= center+1;i<=right;i++)
ret = left_max+right_max;
if(retint max(int a,int n)
return maxsum;
}
最大子段和四種求法
給定n 1 n 100000 個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為 max,1 i j n。例如,當 a 1 a 2 a 3 a 4 a 5 a 6 2,1...
最大子陣列和四種實現
暴力列舉 暴力列舉的方式 時間複雜度o n 3 param array 輸入 return 最大子陣列的和的值 public static intforcemaxsubarray int array if sum maxvalue return maxvalue 優化的暴力列舉 優化的暴力列舉 時間...
最大子串行和的四種演算法
1.窮舉法 演算法思想 算出每個子串行的和,即算出序列中第i個到第j個數的和 j i 並進行比較 演算法 public static int maxsubsum1 int a if sum maxsum return maxsum 執行時間為o n 3 2.對上述第乙個演算法的改進 演算法思想 第乙...