可能重复:
Interview Q: given an array of numbers, return array of products of all other numbers (no division)
我有两个数组inputArray
和resultArray
每个都有n
个元素
任务是resultArray
中的第n个元素应该inputArray
中所有元素的乘法除了inputArray
的第n个元素(全部为n-1
个元素)。
例如。 inputArray={1,2,3,4}
然后resultArray={24,12,8,6}
这很容易......
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
if(i != j) resultArray[i] *= inputArray[j];
但问题是复杂性不应超过 O(n)
我们也不允许使用分部
我该如何解决这个问题?
答案 0 :(得分:4)
如果没有太多损坏,你应该尝试使用两个变量来存储乘法的结果:第i个元素左边和第i个元素右边的乘法的累积结果。
答案 1 :(得分:4)
您可以使用DP方法,如下所示:
vector<int> products(const vector<int>& input) {
int N = input.size();
vector<int> partial(N+1); // partial[i] = input[0]...input[i-1]. partial[0] = 1
partial[0] = 1;
for (int i = 0; i < N; ++i) partial[i+1] = input[i]*partial[i];
vector<int> ans(N);
int current = 1;
for (int i = N-1; i >= 0; --i) {
// current is equal to input[i+1]...input[N-1]
ans[i] = partial[i]*current;
current *= input[i];
}
return ans;
}
这种方法的一种可能用法是当你处理你不能分开的事情时(例如,考虑矩阵的这个问题)。
我使用STL向量做了这个解决方案,但当然代码可以很容易地“翻译”以使用C数组。
答案 2 :(得分:1)
您是否知道乘以奇数是可逆的 - 仅使用乘法?看看Hacker's Delight,叫做“精确划分”。正如在那里所解释的,这个技巧也可以扩展到偶数。所以你可以通过几次乘法“除去”第n个数字 - 因为这是作业,我会让你知道如何。
答案 3 :(得分:0)
看到Daniel Fleischman的回答,我决定自己实施,因为他有很多代码行!
int i, buffer=1, result[n];
for(result[0]=1,i=1;i<n;i++) result[i] = result[i-1]*inputArray[i-1];
for(i=n-1,buffer=1;i>=0;buffer*=inputArray[i],i--) result[i]*=buffer;
三行代码(切掉所有脂肪)。
答案 4 :(得分:0)
main()
{
int i,l,r,x[5]={1,2,3,4,5},y[5]; // x is the initial array, y is the final array
int n = 5; // n be the size of the array, here already defined as 5
l = 1; // l is the product of the values of the left side of an index in x
r = 1; // r is the product of the values of the right side of an index in x
for (i=0 ; i<5 ; i++) y[i]=1; // initialising all y values to 1
for (i=0 ; i<5 ; i++)
{
y[i] = y[i]*l ;
y[n-i-1] = y[n-i-1]*r;
l = l*x[i];
r = r*x[n-i-1];
}
for (i=0; i<5; i++) printf("%d\n",y[i]);
}