题意
给一串整数,可能为正数、负数、0,求连续一串能得到的最大积。思路
根据0来断开一个个子串分别处理。 子串处理方式:子串全部相乘,因为没有小数,如果结果为正数,则返回乘积,负数就从左数和从右数,数到负数结束,看那边得到的数值更小,也就是负数更负,把乘积除以这个左右数中更小的值,就是这个子串的最大乘积。
选出子串中的最大返回值。 几个特殊情况: 数组长度为1,返回第一个代码:
/** * @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;};复制代码