hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:,連續子向量的最大和為8(從第0個開始,到第3個為止)。給乙個陣列,返回它的最大連續子串行的和,你會不會被他忽悠住?(子向量的長度至少是1)
求最大連續子串行和就是求該陣列的連續子集的最大和。
先找出陣列的若干連續子集,比較其和的大小,找出其中最大的。
獲取輸入的陣列
publicview codestatic
void
main(string args)
int max=findgreatestsumofsubarray(n);
system.out.println(max);
}
核心**(最初版)通過兩層迴圈遍歷找出連續子串行和的最大值,時間複雜度為o(n^2)。
publicview codestatic
int findgreatestsumofsubarray(int
array)
//將陣列的第乙個數設為最大值
int max=array[0];
//迴圈遍歷連續字集
for(int i=0;i)}}
return
max;
}
核心**(修改版)通過學習大神的**修改,使用一層迴圈,時間複雜度為o(n)。
publicview codestatic
int findgreatestsumofsubarray(int
array)
//將陣列的第乙個數設為最大值
int max=array[0];
int sum=0;
//迴圈遍歷連續字集
for(int i=0;i)
if(sum>max)
}return
max;
}
核心**(牛客網其他人通過的**)
publicview codeint findgreatestsumofsubarray(int
array)
return
res;
}
題目比較簡單,剛開始我直接寫迴圈從第一位開始算加法的,提交**時才發現自己算的必須是從第一位開始的連續子集,如果連續子集的最大和在中間就會出錯。
審題不清是我犯的最大錯誤,然後通過兩次迴圈判斷,記憶體迴圈是遍歷陣列存在的從第i位開始的連續子集,加上外從迴圈實現了所有連續子集的遍歷。**通過。
通過比較其他**,我發現只需一層迴圈就可以實現連續子集的最大值查詢,不必求出每個連續子集的和。只需將當前位與陣列的前一位的和 與 當前位比較,如果和變**明不是連續最大和,則將當前位的值設為最大值(同時設為連續子串行的最大和),繼續比較,直至結束。
牛客網 連續子陣列的最大和
hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...
牛客網 連續子陣列的最大和
hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...
牛客網 連續子陣列的最大和
hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...