求解最大乘積問題 C 實現

2021-10-07 11:18:39 字數 1710 閱讀 6363

給定乙個無序陣列,包含正數、負數和0,要求從中找到3個數的乘積,使得乘積最大,並且時間複雜度為o(n),空間複雜度為o(1)。

無序整數陣列a[n]

滿足條件的最大乘積。

43 4 1 2

定義兩個容器,存放最大三個正數 和 最小兩個負數(考慮負負得正)。然後遍歷一遍陣列,每遍歷到乙個元素,就和對應的容器進行判斷。更新容器內的資料(如果需要的話)。最後再來判斷三個正數中最小的兩個乘積和兩個負數的乘積哪個大,然後再和最大的正數相乘。得到結果

#include

#include

#include

using

namespace std;

void

compare

(vector<

int>

&v ,

int k ,

bool control)

//根據判斷正負,來進行不一樣的選擇

if(k < v.

back()

&& control ==

false

)//如果是負數,尾最大,和最大的比較,來相對獲得更小的。(考慮負負得正所以我們要負數絕對值大的)

sort

(v.begin()

, v.

end())

;//進行排序,重新整理對應最小或者最大

}bool

beginsolve

(vector<

int> v1, vector<

int> v2)

//比較是負負的正大,還是最大三個數相對較小的兩個數乘積大。

void

solve

(vector<

int> v1, vector<

int> v2 ,

bool control)

//進行求解

cout << sum << endl;

return;}

else

sum *

= v1.

back()

; cout << sum << endl;

return;}

}//時間複雜度 o(3log3 * n) 資料較大時可近似看為o(n) 空間複雜度o(1)

intmain()

if(k <0)

}solve

(v1, v2,

beginsolve

(v1, v2));

return0;

}

然後我的好朋友xq有了更好的方法,時間複雜度、空間複雜度逼我的比我的好

#include

using

namespace std;

intmain()

//輸入值比"最大"的大,第三大被第二大覆蓋,第二大被第一大覆蓋,最大被輸入值覆蓋

else

if(temp > max2)

else

if(temp > max3)

else

if(temp < min1)

else

if(temp < min2)

}int num;

if(max2 * max3 > min1 * min2)

else

cout << num;

return0;

}

最大乘積問題

題目描述 輸入n個元素組成的序列s,找出乙個乘積最大的連續子串行,輸出最大乘積的值。如果這個最大乘積不是正數,輸出0。n小於18,每個元素值的絕對值不大於10。輸入先輸入n的值,再依次輸入n個數的序列,遇到檔案末尾結束。輸出在一行輸出最大乘積的值。樣例輸入 52 5 1 2 1 樣例輸出 20當看到...

演算法作業 求解最大乘積問題 dp

這道題要求時間複雜度為o n 空間複雜度為o 1 因此用dp是最簡單的做法。由於這道題存在負數,所以我在儲存最大值時,也儲存了最小值。include include include using std cin using std cout using std endl using std strin...

暴力求解之最大乘積

參考 書籍 劉汝佳 演算法競賽入門 給乙個數字集合,請從這個數字集合裡找出一段連續數字,使他們的乘積是最大的。樣例輸入 3 2 4 3 5 2 5 1 2 1 3 9 7 8 2 1 1 1 9 1 n 18,10 si 10.連續的子串行有兩個要素,即起點和終點 因此只需列舉起點和終點即可,由於至...