用C 解決最大乘積問題(拼多多2018校招題)

2021-09-19 06:40:06 字數 1849 閱讀 7761

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

陣列裡元素的個數n

無序整數陣列a[n]

滿足條件的最大乘積

3 4 1 2

1.陣列的輸入

因為輸入的第一行告訴了我們陣列的大小,故我們可以構建動態陣列來接收輸入。

2.資料的型別

在oj上給出的測試案例中,有一次的輸出為807120253114,是乙個12位整數,不論是int,float還是long型都存不下如此大的值:

int                  2位元組,65536;

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,古老編譯器很容易發生未知問題

比較後,我們選用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當看到...