輸入一組浮點數,求出這個浮點陣列最大乘積的連續子串。舉個例子,浮點陣列為str=,這時得出來的結果是前兩個浮點數的乘積,即15。需要注意的是,這個子串是要求連續的,另外,子串的長度可以為1.
這裡給出兩種思路,後續可能還會加入新的思路。
第一種是直接求解。即用雙層迴圈。外面一層是從1到浮點陣列的長度,裡面的那層迴圈是當前的位置加1一直到浮點陣列的結束,裡面的迴圈來算所有的乘積。換句話說就是,內層迴圈每次從i+1開始到浮點陣列結束的乘積,這些乘積是str[i]*str[i+1],str[i]*str[i+1]*str[i+2],...,str[i]*...*str[length(str)]中找到最大的那個。外層迴圈則是找到全域性最大的那個。這個方法比較好想,只給出偽**。下面是偽**:
for i = 0 to length(str)
current = str[i]
for j = i + 1 to length(str)
current *= str[j]
if(current_max < current)
current_max = current
endif(max < current_max)
max = current_max
end
第二種思路就是如果當前已經找到乙個序列的最大的值為current_max,那麼加入陣列中的下乙個值會是什麼
結果呢?如果要乘以大於1的正數的話,顯然current_max的值還會增大,但要乘以乙個小於-1
的負數的話,current_max則會變成乙個當前最小的數。所以,我們可以在找最大乘積序列的時候
同時找一下最小乘積序列。這樣一來,如果是乘以乙個大於1的正數的話
current_max還是當前最大
的,current_min還是當前最小的。但是乘以乙個小於-1的負數的話,則current_max變成了當前最
小的而current_min變成了當前最大的,這時可以交換current_max和current_min的值。而當乘
以乙個絕對值小於1的數的話current_max會變小,current_min會變大,所以另外需要乙個全域性變
量來單獨記錄最大的乘積(max)和最小值乘積(min)。這裡還需要注意一點,如果當前最大值小於1
時,需要記錄str[i],並與全域性最大值max比較一下。具體可以看下面的程式實現。
#include #define max_buf 1024
int main(int argc, char *argv)
return 0;
}double max_multi_substring(double *str, const int length)
if(current_max < 1)
} return max;
}
資料1(含有乙個正數):; 結果:1;
資料2(含有乙個負數):; 結果:-0.2;
資料3(含一組正小數):;結果:0.8;
資料4(一組正負小數):;結果:0.9;
資料5(正負相間正數):;結果:96;
資料6(正負整數隨機):;結果:192;
資料7(正負整數小數):;結果:16.8。
1. 3月面試集訓第2周回顧 最大乘積連續子串:
2. 第二十八~二十九章 最大連續乘積子串、字串編輯距離:
接下來需要輸出這個乘積最大的子串行怎麼實現,實現可以在更新全域性最大值max的過程中記錄一下當前的起止位置。這個可由讀者自行思考。
說明:
23最大乘積子串
題目描述 給乙個浮點數序列,取最大乘積連續子串的值,例如 2.5,4,0,3,0.5,8,1,則取出的最大乘積連續子串為3,0.5,8。也就是說,上述陣列中,3 0.5 8這3個數的乘積3 0.5 8 12是最大的,而且是連續的。提醒 子串子串行不同,子串要求連續,子串行不要求連續。分析 這個問題與...
陣列連續子陣列最大和最大乘積
題目 給定乙個陣列,要求其連續子陣列的最大和。如陣列為,連續子陣列的最大和為8 從第0個開始,到第3個為止 解法1 首先最容易想到的便是利用列舉的方法,列舉出所有可能大小的連續子陣列的和,然後選出其中最大的乙個。即從連續子陣列的大小為1一直到n,分別計算它們的和,最後選出使和最大的那個子陣列。這種方...
動態規劃 最大乘積子串
給定乙個陣列,求其中乘積最大的子串的乘積。如陣列 2,3,2,4 最大乘積為2 3 6.分析 最簡單的方法是設定乙個二維陣列p i j 表示從 i 到 j 這個子串的乘積,然後求p中的最大值。但這種方法時間複雜度和空間複雜度都比較高。計算子串的乘積,如果中間包含了0,那麼整個子串的乘積就是0。因此,...