給定乙個無序陣列,包含正數、負數和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.連續的子串行有兩個要素,即起點和終點 因此只需列舉起點和終點即可,由於至...