📣 独立日限时特惠: VIP通行证立减$68
12
返回列表 发新帖
楼主: ztxiong2151049
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] Maximum Product Subarray

🔗
averillzheng 2014-10-9 11:29:14 | 只看该作者
全局:
就是简单的dp问题。
回复

使用道具 举报

🔗
285845348 2014-10-17 12:06:44 | 只看该作者
全局:
class Solution:
    def maxProduct(self, A):
        ps, ns = [A[0]], [A[0]]
        for i in xrange(1, len(A)):
            tp, tn = ps[-1], ns[-1]
            ps.append(max(A[i], A[i] * tp, A[i] * tn))
            ns.append(min(A[i], A[i] * tn, A[i] * tp))
        return max(ps)
回复

使用道具 举报

🔗
quan1614 2014-11-18 10:02:26 | 只看该作者
全局:
damajia 发表于 2014-9-25 02:59
就是普通的 DP 不明白为什么写这么长

你写的答案错了,自己到leetcodeOJ上提交一遍,自己在看看吧
回复

使用道具 举报

🔗
GLambda 2014-11-25 01:19:51 | 只看该作者
全局:
O(n)的,想法是最大值 = 最小负值 * 最小负值,或者是最大正值 * 最大正值。最小负值 = 最大正值 * 最小负值
  1. class Solution {
  2. public:
  3.     int maxProduct(int A[], int n) {
  4.         vector<int> maxdp(n), mindp(n);
  5.         
  6.         maxdp[0] = mindp[0] = A[0];
  7.         int maxv = maxdp[0];
  8.         for (int i = 1; i < n; i++) {
  9.             maxdp[i] = max(mindp[i - 1] * A[i], maxdp[i - 1] * A[i]);
  10.             maxdp[i] = max(maxdp[i], A[i]);
  11.             mindp[i] = min(mindp[i - 1] * A[i], maxdp[i - 1] * A[i]);
  12.             mindp[i] = min(mindp[i], A[i]);
  13.             maxv = max(maxv, maxdp[i]);
  14.         }
  15.         return maxv;
  16.     }
  17. };
复制代码
回复

使用道具 举报

🔗
chong 2014-12-23 20:28:27 | 只看该作者
全局:
quan1614 发表于 2014-11-17 20:02
你写的答案错了,自己到leetcodeOJ上提交一遍,自己在看看吧

我觉得他写的是对的啊。同时保存局部最小和最大,保存最小是用乘法的负负得正的规律决定的。
回复

使用道具 举报

🔗
quan1614 2015-12-26 17:55:34 | 只看该作者
全局:
chong 发表于 2014-12-23 20:28
我觉得他写的是对的啊。同时保存局部最小和最大,保存最小是用乘法的负负得正的规律决定的。

maxProduct要求是连续的,它只保留了历史上最大最小的,没有保留当前临时最大最小的。
或者简单点说,这种做法不能保证得到的是连续区间的,所以错了
我邮箱 dongjiaquan89@gmail.com 可以私下说
回复

使用道具 举报

🔗
traderalg 2016-1-6 12:24:10 | 只看该作者
全局:
O(N) algorithm:

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int n = nums.size();
        if(n<=0) return 0;
        int ret, curMax, curMin;
        ret = curMax = curMin = nums[0];
        for(int i=1; i<n; i++) {
            int temp = curMax;
            curMax = max(max(curMax*nums[i], curMin*nums[i]),nums[i]);
            curMin = min(min(temp*nums[i], curMin*nums[i]),nums[i]);
            ret = max(ret, curMax);
        }
        return ret;
    }
};

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表