問題描述:
給定乙個長度為n的整數陣列,只允許用乘法,不能用除法,計算任意(n-1)個數的組合乘積中最大的一組,並寫出演算法的時間複雜度。
解法:1.暴力解法------o(n^2)
2.前字尾法------o(n)
3.統計法--------o(n)
具體思路和**:
1.暴力解法:
思路:利用兩層迴圈,依次刪掉乙個,其餘的做乘法,計算出最大的。
**:
1int 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],找出最大的。
**:
1int 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的數目,奇數的數目,最大負數,最小正數。
**:
1int 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,還要除...