有效地将数组的 (n-1) 元素相乘
Efficiently multiply (n-1) elements of an array
可能的重复项:
面试 Q:给定一个数字数组,返回所有其他数字的乘积数组(无除法(
我有两个数组inputArray
和resultArray
每个数组都有n
元素。
任务是resultArray
中的第 n 个元素应该具有除inputArray
的第 n 个元素(总共n-1
个元素(之外的所有元素的乘法inputArray
。
例如。 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(
我们也不允许使用除法。
我该如何解决这个问题?
在不剧透太多的情况下,您应该尝试使用两个变量来存储乘法的结果:乘法的累积结果位于第 i 个元素的左侧和第 i 个元素的右侧。
您可以使用 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 数组。
您是否知道乘以奇数是可逆的 - 仅使用乘法?参见黑客的喜悦,称为"精确划分"。正如那里所解释的,这个技巧也可以扩展到偶数。因此,您可以通过几次乘法"除以"第 n 个数字 - 由于这是家庭作业,我将留给您来了解如何操作。
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("%dn",y[i]);
}
看到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;
三行代码(去除所有脂肪(。
http://ideone.com/EaQiu
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何通过 getter 函数删除矢量的元素?
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 从控制台中删除最后打印的元素
- 擦除while循环中迭代的元素