1. 簡述
給定乙個長度為n的整數陣列,只允許用乘法,不能夠用除法,計算任意(n-1)個數的組合中乘積最大的一組,並寫出演算法時間複雜度。
2. 思路
題目中要求不能用除法,實際上就是否定了將所有數乘起來,然後分別去除每個數字的方法,實際上這種方法也不好實現,因為如果數字中有0的話,都乘起來就是0,還要除0,麻煩啊,另外,數值溢位也是個麻煩。實際上只要找到n-1個數的組合即可,並不需要去計算這n-1個數字的乘積。
方法就是首先,統計正數,負數,0的個數,以及最大正數的下標,最小正數的下標,最大負數的下標,最小負數的下標,任意乙個0的下標。然後分情況討論:
· 如果0的個數大於1,那麼n-1個數乘積必然是0,那麼隨便選n-1個數字即可,選array[0]-array[n-2]即可。
· 如果0的個數等於1,且負數個數為奇數,那麼乘積要麼為0,要麼是負數,當然0更大了,因此去掉這個任意乙個負數的其餘n-1個數即可。如果負數個數為偶數,那麼乘積要麼為0,要麼是正數,當然正數更大了,因此去掉這個0的n-1個數即可。
· 如果0的個數小於1,且負數個數為奇數,那麼乘積,要麼為正數,要麼為負數,去掉乙個絕對值最小的負數(即最大的負數)即可。如果負數的個數為偶數且當前沒有正數,那麼結果必為負數,那麼去掉乙個最對值最大的負數(即最小的負數),如果負數的個數為偶數,且當前有正數,那麼去掉乙個絕對值最小的正數即可,這樣保證結果是正數。
3. **
這個忽略了。
4. 參考
程式設計之美,2.13節,子陣列的最大乘積
程式設計之美2 13 子陣列最大乘積
問題描述 給定乙個長度為n的整數陣列,只允許用乘法,不能用除法,計算任意 n 1 個數的組合乘積中最大的一組,並寫出演算法的時間複雜度。解法 1.暴力解法 o n 2 2.前字尾法 o n 3.統計法 o n 具體思路和 1.暴力解法 思路 利用兩層迴圈,依次刪掉乙個,其餘的做乘法,計算出最大的。1...
程式設計之美 2 13 子陣列的最大乘積
題目 乙個有n個數的整數陣列 取其中n 1個元素的子陣列 求子陣列的最大乘積 不能用除法。這道題自己沒有寫對,沒有考慮到負數的情況,只是單純的想去掉最小的數。但是若有負數 5 4 3 中 5 4 20更大。需要先統計正數 負數和0的個數,再分類討論。考察的其實就是細心和耐心。答案解法 int get...
程式設計之美 2 13 子陣列的最大乘積
1.簡述 給定乙個長度為n的整數陣列,只允許用乘法,不能夠用除法,計算任意 n 1 個數的組合中乘積最大的一組,並寫出演算法時間複雜度。2.思路 題目中要求不能用除法,實際上就是否定了將所有數乘起來,然後分別去除每個數字的方法,實際上這種方法也不好實現,因為如果數字中有0的話,都乘起來就是0,還要除...