題意數組
給一串整數,可能爲正數、負數、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;
};
複製代碼