Redian新闻
>
明天反恐24前总统Logan要出来 (转载)
avatar
明天反恐24前总统Logan要出来 (转载)# Joke - 肚皮舞运动
j*l
1
You are given an array [a1 ... an] and we have to construct another array [
b1 To bn] where bi = a1 * a2 * ... * an / ai. You are allowed to use only
constant
space and the time complexity is O(n). No divisions are allowed.
解法是引入两个辅助数组
Si = a1 * a2 * ... * ai
Ti = ai * a(i+1) * ... * an
则bi = S[i-1] * T[i+1]
但是有题目要求的O(1)空间和O(n)时间的解法么?
avatar
g*6
2
【 以下文字转载自 CouchPotato 讨论区 】
发信人: greatwar666 (KILL KILL KILL), 信区: CouchPotato
标 题: 明天反恐24前总统Logan要出来
发信站: BBS 未名空间站 (Sun Apr 4 22:58:34 2010, 美东)
出来干什么?
avatar
l*e
3
1. for (i = 1:n-1)
b[i] = a[i]*a[i+1]*a[i+2]*...*a[n];
2. b[0] = b[1];
3. temp = a[0];
4. for (i = 1; i < n; i++)
{
b[i] = temp*b[i+1];
temp *= a[i];
}
Space: temp O(1);
Time: O(n)

【在 j**l 的大作中提到】
: You are given an array [a1 ... an] and we have to construct another array [
: b1 To bn] where bi = a1 * a2 * ... * an / ai. You are allowed to use only
: constant
: space and the time complexity is O(n). No divisions are allowed.
: 解法是引入两个辅助数组
: Si = a1 * a2 * ... * ai
: Ti = ai * a(i+1) * ... * an
: 则bi = S[i-1] * T[i+1]
: 但是有题目要求的O(1)空间和O(n)时间的解法么?

avatar
f*e
4
牛B!

【在 l******e 的大作中提到】
: 1. for (i = 1:n-1)
: b[i] = a[i]*a[i+1]*a[i+2]*...*a[n];
: 2. b[0] = b[1];
: 3. temp = a[0];
: 4. for (i = 1; i < n; i++)
: {
: b[i] = temp*b[i+1];
: temp *= a[i];
: }
: Space: temp O(1);

avatar
j*l
5
原来是要利用输出的数组b缓存辅助数组S和T的结果
avatar
f*e
6
好像不止这么简单

【在 j**l 的大作中提到】
: 原来是要利用输出的数组b缓存辅助数组S和T的结果
avatar
r*o
7
问问,第1步求b[i]的过程实际上相当于O(n^2)吧。

【在 l******e 的大作中提到】
: 1. for (i = 1:n-1)
: b[i] = a[i]*a[i+1]*a[i+2]*...*a[n];
: 2. b[0] = b[1];
: 3. temp = a[0];
: 4. for (i = 1; i < n; i++)
: {
: b[i] = temp*b[i+1];
: temp *= a[i];
: }
: Space: temp O(1);

avatar
j*l
8
可以用例子说明,假如n = 5
首先让b从前向后一重循环累乘并赋值得到b的五个元素如下:
1, a1, a1*a2, a1*a2*a3, a1*a2*a3*a4
然后从后向前一重循环累乘
第五个元素乘1,
第四个元素乘a5
第三个元素乘a5*a4
第二个元素乘a5*a4*a3
第一个元素乘a5*a4*a3*a2
avatar
j*l
9
假定n = 5,数组下标从1开始。
int iter = 1;
int i;
for (i = 1; i <= 5; i++)
{
b[i] = iter;
iter *= a[i];
}
iter = 1;
for (i = 5; i >= 1; i--)
{
b[i] *= iter;
iter *= a[i];
}
avatar
m*g
10
niu

【在 l******e 的大作中提到】
: 1. for (i = 1:n-1)
: b[i] = a[i]*a[i+1]*a[i+2]*...*a[n];
: 2. b[0] = b[1];
: 3. temp = a[0];
: 4. for (i = 1; i < n; i++)
: {
: b[i] = temp*b[i+1];
: temp *= a[i];
: }
: Space: temp O(1);

avatar
l*e
11
不好意思:第一步写错了。应该是:
1. for (i = n - 1; n > 0; i--)
b[i] = a[i]*a[i+1]*a[i+2]*...*a[n];
Sorry for the misleading.

【在 r****o 的大作中提到】
: 问问,第1步求b[i]的过程实际上相当于O(n^2)吧。
avatar
f*4
12
这道题目是求 N个元素数组中 N-1个元素最大积吧?
求连续元素最大乘积的,能用辅助数组解决么?
O(n)的是记录最大,最小乘积
avatar
l*a
13
you r right.

【在 r****o 的大作中提到】
: 问问,第1步求b[i]的过程实际上相当于O(n^2)吧。
avatar
d*n
14
it's O(n) if you do like this:
b[n-1] = a[n-1];
1. for (i = n-2:1)
b[i] = a[i]*b[i+1];

【在 l*****a 的大作中提到】
: you r right.
avatar
l*a
15
thanks

【在 d****n 的大作中提到】
: it's O(n) if you do like this:
: b[n-1] = a[n-1];
: 1. for (i = n-2:1)
: b[i] = a[i]*b[i+1];

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。