Leetcode 152. Maximum Product Subarray javascript解決方案

題意數組

給一串整數,可能爲正數、負數、0,求連續一串能獲得的最大積。

思路bash

根據0來斷開一個個子串分別處理。 子串處理方式:子串所有相乘,由於沒有小數,若是結果爲正數,則返回乘積,負數就從左數和從右數,數到負數結束,看那邊獲得的數值更小,也就是負數更負,把乘積除以這個左右數中更小的值,就是這個子串的最大乘積。
選出子串中的最大返回值。
幾個特殊狀況:
數組長度爲1,返回第一個
ui

代碼:spa

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxProduct = function(nums) {
    /**
     * @param {number[]} non 0 number list
     * @return {number} max product
     */
    function handleNonZeroList(list){
        if(list.length < 2){
            return list[0];
        }
        let productTotal = 1;
        list.forEach(obj => {
            productTotal *= obj;
        });
        if(productTotal > 0){
            return productTotal;
        }
        let leftProduct = 1, leftMinus = -1;
        for(let i = 0;i < list.length; ++i){
            if(list[i] < 0){
                leftMinus = list[i];
                break;
            }
            leftProduct *= list[i];
        }
        leftProduct *= leftMinus;
        let rightProduct = 1, rightMinus = -1;
        for(let i = list.length - 1;i >= 0; --i){
            if(list[i] < 0){
                rightMinus = list[i];
                break;
            }
            rightProduct *= list[i];
        }
        rightProduct *= rightMinus;
        return productTotal /= (leftProduct > rightProduct ? leftProduct : rightProduct);
    }
    if(nums.length < 2){
        return nums[0];
    }
    let arrays = [], tmpList = [], hasZero = false;
    for(let i = 0;i < nums.length; ++i){
        if(nums[i] === 0){
            hasZero = true;
            if(tmpList.length > 0){
                arrays.push(tmpList);
                tmpList = [];
            }
        }
        else{
            tmpList.push(nums[i]);
        }
    }
    if(tmpList.length > 0){
        arrays.push(tmpList);
        tmpList = [];
    }
    let max = 0;
    for(let i = 0; i < arrays.length; ++i){
        let tmp = handleNonZeroList(arrays[i]);
        if(tmp > max){
            max = tmp;
        }
    }
    if(max < 0 && hasZero){
        return 0;
    }
    return max;
};

複製代碼
相關文章
相關標籤/搜索