由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 亚马逊电话面经
相关主题
给定一个数组,找出3个数乘积最大。A电面
问道微软面试DP题m家面经
FB 店面面经请教中文OJ一道题
Palantir面经分享几个公司的面试题
请教题目 在一组数中找到最大子集乘积Linkedin悲剧,发面经
问道数组元素连续相乘的名题某大公司两道题
2道面试题.来一道DP了好像也无法多项式的题目
问两道题目(算法和开放问题)Help, Algorithms questions
相关话题的讨论汇总
话题: maxp话题: maxn话题: int话题: max话题: neg
进入JobHunting版参与讨论
1 (共1页)
l********t
发帖数: 123
1
给一个数组 里边都是整数 求最大乘积的连续子数组
f*********i
发帖数: 197
2
x = a0*a1...*an
find x1 = a0*a1...ai where ai is the first negative element
find x2 = an*an-1...aj where aj is the last negative element
if x is positive, then x,
if x is negative, then max(x/x1, x/x2,x1/ai,x2/aj)
if there are 0 in the array, then divide the array into different groups by
0 and applied the way mentioned above to each group.
it is an O(n) approach.
m**q
发帖数: 189
3
想到了一个DP解,不过要复杂一些:
pos[i]: 以i结尾的最大绝对值乘积的正值
neg[i]: 以i结尾的最大绝对值乘积的负值
pe[i]: 存在以i结尾的正值
ne[i]: 存在以i结尾的负值
max: 当前连续乘积的最大值

pos[i-1] * a[i] (a[i] > 0 && pe[i-1] != 0)
pos[i] = neg[i-1] * a[i] (a[i] < 0 && ne[i-1] != 0)
a[i] (otherwise)
pos[i-1] * a[i] (a[i] < 0 && pe[i-1] != 0)
neg[i] = neg[i-1] * a[i] (a[i] > 0 && ne[i-1] != 0)
a[i] (otherwise)
pe[i] = pos[i] > 0;
ne[i] = neg[i] < 0;
max = MAX(max, pos[i]);
可以优化到只需要O(1)的额外空间,时间复杂度也是O(n)。


by

【在 f*********i 的大作中提到】
: x = a0*a1...*an
: find x1 = a0*a1...ai where ai is the first negative element
: find x2 = an*an-1...aj where aj is the last negative element
: if x is positive, then x,
: if x is negative, then max(x/x1, x/x2,x1/ai,x2/aj)
: if there are 0 in the array, then divide the array into different groups by
: 0 and applied the way mentioned above to each group.
: it is an O(n) approach.

d*******l
发帖数: 338
4
int MaxProduct(int a[], int n)
{
int maxp = 0, maxn = 0;
int ans = 0;
for(int i = 0; i < n; i++) {
if(!a[i]) maxp = maxn = 0;
else if(a[i] > 0) {
maxp = max(maxp*a[i], a[i]);
maxn = a[i]*maxn;
} else {
int t = maxn;
maxn = min(maxp*a[i], a[i]);
maxp = a[i]*t;
}
ans = max(ans, maxp);
}
return (n==1)?a[0]:ans;
}

【在 m**q 的大作中提到】
: 想到了一个DP解,不过要复杂一些:
: pos[i]: 以i结尾的最大绝对值乘积的正值
: neg[i]: 以i结尾的最大绝对值乘积的负值
: pe[i]: 存在以i结尾的正值
: ne[i]: 存在以i结尾的负值
: max: 当前连续乘积的最大值
:
: pos[i-1] * a[i] (a[i] > 0 && pe[i-1] != 0)
: pos[i] = neg[i-1] * a[i] (a[i] < 0 && ne[i-1] != 0)
: a[i] (otherwise)

m**q
发帖数: 189
5
赞! 这个真简洁

【在 d*******l 的大作中提到】
: int MaxProduct(int a[], int n)
: {
: int maxp = 0, maxn = 0;
: int ans = 0;
: for(int i = 0; i < n; i++) {
: if(!a[i]) maxp = maxn = 0;
: else if(a[i] > 0) {
: maxp = max(maxp*a[i], a[i]);
: maxn = a[i]*maxn;
: } else {

g**********y
发帖数: 14569
6
对有0的情况,象你说的divide-and-conqueror.
没有0时,
1. 扫描a, 生成负数子集neg
2. neg数为偶数,return product of a[]
3. neg数是奇数,return max(product of a[0..最后一个负数前],
product of a[第一个负数后..N-1]

by

【在 f*********i 的大作中提到】
: x = a0*a1...*an
: find x1 = a0*a1...ai where ai is the first negative element
: find x2 = an*an-1...aj where aj is the last negative element
: if x is positive, then x,
: if x is negative, then max(x/x1, x/x2,x1/ai,x2/aj)
: if there are 0 in the array, then divide the array into different groups by
: 0 and applied the way mentioned above to each group.
: it is an O(n) approach.

s**x
发帖数: 7506
7
0.1 * 0.2 < 0.1, so not correct

【在 g**********y 的大作中提到】
: 对有0的情况,象你说的divide-and-conqueror.
: 没有0时,
: 1. 扫描a, 生成负数子集neg
: 2. neg数为偶数,return product of a[]
: 3. neg数是奇数,return max(product of a[0..最后一个负数前],
: product of a[第一个负数后..N-1]
:
: by

g**********y
发帖数: 14569
8
题目都是整数

【在 s**x 的大作中提到】
: 0.1 * 0.2 < 0.1, so not correct
m******n
发帖数: 6327
9
不对,0 -3 0 -3 0
必须返回这5个数

【在 g**********y 的大作中提到】
: 对有0的情况,象你说的divide-and-conqueror.
: 没有0时,
: 1. 扫描a, 生成负数子集neg
: 2. neg数为偶数,return product of a[]
: 3. neg数是奇数,return max(product of a[0..最后一个负数前],
: product of a[第一个负数后..N-1]
:
: by

g**********y
发帖数: 14569
10
为什么?不就是返回0?

【在 m******n 的大作中提到】
: 不对,0 -3 0 -3 0
: 必须返回这5个数

m******n
发帖数: 6327
11
要求返还连续子集

【在 g**********y 的大作中提到】
: 为什么?不就是返回0?
g**********y
发帖数: 14569
12
最大乘积的连续子集,0,和{0,-3,0,-3,0}不是一样的吗?

【在 m******n 的大作中提到】
: 要求返还连续子集
m******n
发帖数: 6327
13
最大乘积一样,子集不一样。
所以按0分割成子集,有漏洞。

【在 g**********y 的大作中提到】
: 最大乘积的连续子集,0,和{0,-3,0,-3,0}不是一样的吗?
1 (共1页)
进入JobHunting版参与讨论
相关主题
Help, Algorithms questions请教题目 在一组数中找到最大子集乘积
问个算法题问道数组元素连续相乘的名题
Amazon 二面面经2道面试题.
amazon面试题目讨论贴问两道题目(算法和开放问题)
给定一个数组,找出3个数乘积最大。A电面
问道微软面试DP题m家面经
FB 店面面经请教中文OJ一道题
Palantir面经分享几个公司的面试题
相关话题的讨论汇总
话题: maxp话题: maxn话题: int话题: max话题: neg