題目描述
HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全爲正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:{6,-3,-2,7,-15,1,2,2},連續子向量的最大和爲8(從第0個開始,到第3個爲止)。你會不會被他忽悠住?(子向量的長度至少是1)
思路:
1.首先想到的辦法就是窮舉,依次以每個數爲根基,找最大連續子向量。這樣就可以得到n個最大連續子向量,最後找出n個連續子向量中最大的那個子向量,返回即可。
public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
int lens = array.length;
int temp, sum;//注意初始值不可爲0,防止數組只有負數
int[] result = new int[lens];
int endRes;
for(int j=0;j<lens;j++){//依次以每個數爲根基,如果有n個數,那麼我們就能找出n個最大子向量。
sum = array[j];
temp = array[j];
for(int i=j+1;i<lens;i++){
if(temp+array[i]>temp){
sum = temp + array[i];
}
temp=temp+array[i];
}
result[j]=sum;
}
endRes = result[0];
for(int i=0;i<lens;i++){//比較n個最大子向量,找出最大的那個
if(result[i]>endRes){
endRes = result[i];
}
}
return endRes;
}
}
2.使用動態規劃法
public int FindGreatestSumOfSubArray(int[] array) {
int res = array[0]; //記錄當前所有子數組的和的最大值
int max=array[0]; //包含array[i]的連續數組最大值
for (int i = 1; i < array.length; i++) {
max=Math.max(max+array[i], array[i]);
res=Math.max(max, res);
}
return res;
}