程式設計之美2 13 子陣列最大乘積

2022-08-30 10:42:11 字數 1802 閱讀 6455

問題描述:

給定乙個長度為n的整數陣列,只允許用乘法,不能用除法,計算任意(n-1)個數的組合乘積中最大的一組,並寫出演算法的時間複雜度。

解法:1.暴力解法------o(n^2)

2.前字尾法------o(n)

3.統計法--------o(n)

具體思路和**:

1.暴力解法:

思路:利用兩層迴圈,依次刪掉乙個,其餘的做乘法,計算出最大的。

**:

1

int s1(int a, intn)2

9 max =s;

10for(int i = 1; i < n; i++)

1120

return

max;

21 }

2.前字尾法------o(n)

思路:第一遍迴圈記錄i前面所有數字的積 s[i]

第二遍迴圈記錄i後面所有數字的積 t[i]

最後一遍迴圈計算s[i] * t[i],找出最大的。

**:

1

int s2(int a, intn)2

13 f = 1;14

for(int i = n - 2; i >= 0; i--)

1519

reverse(t.begin(),t.end());

20int max = s[0] * t[0

];21

for(int i = 1; i < n; i++)

2226

return

max;

27 }

3.統計法

思路:根據陣列中正負數以及0的個數分情況討論

(1):若有兩個及兩個以上0,則返回0。

(2):若有奇數個負數,但不存在0,則去掉最大的負數。

(3):若有奇數個負數,且存在乙個0,則返回0。

(4):若有偶數個負數,但不存在0,則去掉最小的正數。

(5):若有偶數個負數,且存在乙個0,則去掉0。

綜上所述,我們在掃瞄一次的時候要記錄0的數目,奇數的數目,最大負數,最小正數。

**:

1

int s3(int a, intn)2

22else

2327}28

}29/*30

分情況討論

31*/

3233

//若有兩個及兩個以上0,則返回0。

34if(num0 > 1)35

return0;

3637

//若有奇數個負數,但不存在0,則去掉最大的負數。

38if((num_1 % 2) & (num0 == 0

))39

46return

sum;47}

4849

//若有奇數個負數,且存在乙個0,則返回0。

50if((num_1 % 2) & (num0 == 1

))51

return0;

5253

//若有偶數個負數,但不存在0,則去掉最小的正數。

54if(((num_1 % 2) == 0) & (num0 == 0

))55

62return

sum;63}

6465

//若有偶數個負數,且存在乙個0,則去掉0。

66if(((num_1 % 2) == 0) & (num0 == 1

))67

74return

sum;75}

76 }

我的**可能存在一些冗餘,這裡就不優化了,有興趣的同學可以試試,我這裡主要是 講解題思路。

程式設計之美 2 13 子陣列的最大乘積

1.簡述 給定乙個長度為n的整數陣列,只允許用乘法,不能夠用除法,計算任意 n 1 個數的組合中乘積最大的一組,並寫出演算法時間複雜度。2.思路 題目中要求不能用除法,實際上就是否定了將所有數乘起來,然後分別去除每個數字的方法,實際上這種方法也不好實現,因為如果數字中有0的話,都乘起來就是0,還要除...

程式設計之美 2 13 子陣列的最大乘積

題目 乙個有n個數的整數陣列 取其中n 1個元素的子陣列 求子陣列的最大乘積 不能用除法。這道題自己沒有寫對,沒有考慮到負數的情況,只是單純的想去掉最小的數。但是若有負數 5 4 3 中 5 4 20更大。需要先統計正數 負數和0的個數,再分類討論。考察的其實就是細心和耐心。答案解法 int get...

程式設計之美 2 13 子陣列的最大乘積

1.簡述 給定乙個長度為n的整數陣列,只允許用乘法,不能夠用除法,計算任意 n 1 個數的組合中乘積最大的一組,並寫出演算法時間複雜度。2.思路 題目中要求不能用除法,實際上就是否定了將所有數乘起來,然後分別去除每個數字的方法,實際上這種方法也不好實現,因為如果數字中有0的話,都乘起來就是0,還要除...