“人造大腦”:改變世界的強有力工具!
阿新 • • 發佈:2020-10-17
一、題目
給定一個整型陣列,在陣列中找出由三個陣列成的最大乘積,並輸出這個乘積。
示例 1:
輸入: [1,2,3]
輸出: 6
示例 2:
輸入: [1,2,3,4]
輸出: 24
注意:
- 給定的整型陣列長度範圍是[3,104],陣列中所有的元素範圍是[-1000, 1000]。
- 輸入的陣列中任意三個數的乘積不會超出32位有符號整數的範圍。
二、題解
- 把負數區分開
- 找到非負數的最大的三個值m1,m2,m3
- 找到負數的最大的三個值m1,m2,m3
- 比較非負數m2 * m3 與 負數m1 * m2
- 若前者大,最大乘積為 非負數m1 * 非負數m2 * m3
- 若後者大,最大乘積為 非負數m1 * 負數m1 * m2
- 排除一種特殊情況,若全是負數 最大乘積為 負數m1 * 負數m1 * m2
class Solution { public int maximumProduct(int[] nums) { int posM1 = 0; int posM2 = 0; int posM3 = 0; int negM1 = 0; int negM2 = 0; int negM3 = 0; int result = 0; int posCount = 0; for (int i = 0; i < nums.length; i++) { if (nums[i]>=0){ posCount++; if(nums[i]>=posM1) { posM3 = posM2; posM2 = posM1; posM1 = nums[i]; } else if (nums[i]>=posM2) { posM3 = posM2; posM2 = nums[i]; } else if (nums[i]>=posM3) { posM3 = nums[i]; } } else { if (nums[i]<negM1) { negM3 = negM2; negM2 = negM1; negM1 = nums[i]; } else if (nums[i]<negM2) { negM3 = negM2; negM2 = nums[i]; } else if (nums[i]<negM3) { negM3 = nums[i]; } } } if (poscount==0) { result = negM1 * negM2 * negM3; } else { result = (negM1*negM2 > posM2*posM3) ? posM1*negM1*negM2 : posM1*posM2*posM3; } return result; } }
- 時間複雜度O(n)
- 空間複雜度O(1)
- 執行用時:4 ms, 在所有 Java 提交中擊敗了74.12%的使用者
- 記憶體消耗:39.6 MB, 在所有 Java 提交中擊敗了99.72%的使用者