1. 程式人生 > 實用技巧 >“人造大腦”:改變世界的強有力工具!

“人造大腦”:改變世界的強有力工具!

一、題目

給定一個整型陣列,在陣列中找出由三個陣列成的最大乘積,並輸出這個乘積。

示例 1:

輸入: [1,2,3]
輸出: 6

示例 2:

輸入: [1,2,3,4]
輸出: 24

注意:

  1. 給定的整型陣列長度範圍是[3,104],陣列中所有的元素範圍是[-1000, 1000]。
  2. 輸入的陣列中任意三個數的乘積不會超出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%的使用者