栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

LeetCode152 乘积最大子数组

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode152 乘积最大子数组

LeetCode152 乘积最大子数组
  • 题目
  • 解题
    • 解题一:动态规划
    • 解题二:正向逆向结合

题目


寻找的是 连续 子数组。

解题 解题一:动态规划

思路和 LeetCode53 最大子序和 动态规划解法类似:

解决方案:

// javascript
var maxProduct = function(nums) {
    let numsLen = nums.length;
    let maxF = nums[0], minF = nums[0], ans = nums[0];
    for (let i = 1; i < numsLen; i++) {
    	// 先进行记录,不然下面 maxF 改变后,minF 计算值错误
        let mx = maxF, mn = minF;
        maxF = Math.max(nums[i], nums[i] * mx, nums[i] * mn);
        minF = Math.min(nums[i], nums[i] * mx, nums[i] * mn);
        ans = Math.max(maxF, ans);
    }
    return ans;
};

解题二:正向逆向结合

参考 python5行:不同于回溯、DP的tricks解法,核心思想是先分情况讨论,然后发现主要问题是解决 有奇数个负数的情况,注意 有 0 的情况

// javascript
var maxProduct = function(nums) {
    let numsLen = nums.length;
    // 先比较省去下面 注释的部分
    let maxRes = Math.max(nums[0], nums[numsLen - 1]);
    let curRes;
    curRes = nums[0];
    for (let i = 1; i < numsLen; i++) {
        // 当 curRes = 0 时,curRes = nums[i]
        curRes = (curRes === 0) ? nums[i] : curRes * nums[i];
        maxRes = Math.max(maxRes, curRes);
    }
    curRes = nums[numsLen - 1];
    // maxRes = Math.max(maxRes, curRes);
    for (let i = numsLen - 2; i >= 0; i--) {
        curRes = (curRes === 0) ? nums[i] : curRes * nums[i];
        maxRes = Math.max(maxRes, curRes);
    }
    return maxRes;
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/313477.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号