給定乙個無序陣列,包含正數、負數和0,要求從中找出3個數的乘積,使得乘積最大,要求時間複雜度:o(n),空間複雜度:o(1)
陣列裡元素的個數n無序整數陣列a[n]
滿足條件的最大乘積
3 4 1 21.陣列的輸入
因為輸入的第一行告訴了我們陣列的大小,故我們可以構建動態陣列來接收輸入。
2.資料的型別
在oj上給出的測試案例中,有一次的輸出為807120253114,是乙個12位整數,不論是int,float還是long型都存不下如此大的值:
int 2位元組,65536;比較後,我們選用long long這一超長整型來存值。long 4位元組,2^31-1,(2,147,483,647),約21億;
unsigned long 4位元組,2^32-1,約42億;
long long 8位元組,2^63-1,(9,223,372,036,854,775,807),約9e18;
ps: c++11中才正式引入long long,古老編譯器很容易發生未知問題
3.如何判斷哪三個數的乘積最大
因為陣列中既可以存正數,又可以存負數,故需分情況討論。
4.排序演算法
我們如何找出最大的幾個數與最小的幾個數呢?這裡我們選用選擇排序演算法
(具體演算法請自行學習,也可看下面的**學習)。
除了以上幾點,我們還需要定義兩個陣列分別存最大的4個數和最小的兩個數,下面的**中陣列bmax是用來存最大的四個數的,bmin是用來存最小的兩個數的。我們每進行一次選擇排序,都會將最大的和最小的值傳入相應的陣列中,然後利用bmax陣列判斷正數的個數,根據第3點中的乘積最大的判斷條件來進行輸出。
#include using namespace std;
int main()
, cmin[2] = ;
cin >> i;
long long z, v;
//long long為乙個超長的整型,因為此題的輸出很大,超過12位整數的都有,故需用到此種型別
long long* a = new long long[i];
long long* p = new long long[i];
for (j = 0; j < i; j++)
for (int m = 0; m <= 3; m++) //選擇排序演算法開始
if (max != m)
bmax[m] = a[m]; //傳最大值進陣列
if (min != m)
if (m <= 1)
cmin[m] = p[m]; //傳最小值進陣列
} if (bmax[0] < 0)
else if (bmax[1] < 0||bmax[2]<0)
else
{ z = bmax[0] * bmax[1] * bmax[2];
v = bmax[0] * cmin[0] * cmin[1];
if (z > v) cout << z;
else cout 解題成功
學習c++最好的上手書籍:
拼多多2018校招 最大乘積
給定乙個無序陣列,包含正數 負數和0,要求從中找出3個數的乘積,使得乘積最大,要求時間複雜度 o n 空間複雜度 o 1 輸入描述 第一行是陣列大小n,第二行是無序整數陣列a n 輸出描述 滿足條件的最大乘積輸入例子1 4 3 4 1 2輸出例子1 24思路 找出最小 次小,最大,次大,第三大的五個...
牛客網拼多多校招最大乘積
給定乙個無序陣列,包含正數 負數和0,要求從中找出3個數的乘積,使得乘積最大,要求時間複雜度 o n 空間複雜度 o 1 輸入描述 輸入共2行,第一行包括乙個整數n,表示陣列長度 第二行為n個以空格隔開的整數,分別為a1,a2,an 輸出描述 滿足條件的最大乘積 示例1輸入 43 4 1 2 輸出2...
最大乘積問題
題目描述 輸入n個元素組成的序列s,找出乙個乘積最大的連續子串行,輸出最大乘積的值。如果這個最大乘積不是正數,輸出0。n小於18,每個元素值的絕對值不大於10。輸入先輸入n的值,再依次輸入n個數的序列,遇到檔案末尾結束。輸出在一行輸出最大乘積的值。樣例輸入 52 5 1 2 1 樣例輸出 20當看到...