剑指offer:构建乘积数组
来源:互联网 发布:ubuntu 15.04 vim配置 编辑:程序博客网 时间:2024/05/29 17:16
题目描述切换到MarkDown编辑器
给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。
解题思路:
解法一:暴力方法
不能使用除法,对于每个B[i]可以按公式给出的方法,一个个求解。时间复杂度为O(n^2)。
解法二:
将B[i]的求解分为两部分,第一部分先求B[i] = A[0] * A[1] * A[2] *……*A[i-1];第二部分再求B[i] =B[i] * A[i+1] * A[i + 2] * ……*A[n-1] =A[0] * A[1] * A[2] *……*A[i-1]* A[i+1] * A[i + 2] * ……*A[n-1]。
先求第一部分,B[0] = 1; B[1] = A[0]; B[2] = A[0] * A[1]; B[3] = A[0] * A[1] * A[2]; B[4] = A[0] * A[1] * A[2] * A[3]……
int temp = 1;
for (int i = 0; i < n; i++)
{
B[i] = temp;
temp = temp * A[i + 1];
}
第二部分同理可求得B[n-1] = B[n-1]; B[n-2] = B[n-2] * A[n-1]; B[n-3] = B[n-3] * A[n-1] * A[n-2];……;B[0] = B[0] * A[1] * A[2] * ……*A[n-1];
c++代码如下:
vector<int> multiply(const vector<int>& A) {
vector<int> B;
if (A.empty() || A.size() == 1){
return B;
}
B.push_back(1);
int length = A.size();
int leftMult = 1;
for (int i = 1; i < length; i++){
leftMult = leftMult * A[i - 1];
B.push_back(leftMult);
}
int rightMult = 1;
for (int i = length - 2; i >= 0; i--) {
rightMult = rightMult * A[i+1];
B[i] = B[i] * rightMult;
}
return B;
}
vector<int> B;
if (A.empty() || A.size() == 1){
return B;
}
B.push_back(1);
int length = A.size();
int leftMult = 1;
for (int i = 1; i < length; i++){
leftMult = leftMult * A[i - 1];
B.push_back(leftMult);
}
int rightMult = 1;
for (int i = length - 2; i >= 0; i--) {
rightMult = rightMult * A[i+1];
B[i] = B[i] * rightMult;
}
return B;
}
0 0
- 剑指offer--构建乘积数组
- 《剑指offer》构建乘积数组
- 剑指offer-构建乘积数组
- 剑指offer:构建乘积数组
- 剑指offer:构建乘积数组
- 剑指offer:构建乘积数组
- [剑指offer]构建乘积数组
- 剑指offer|构建乘积数组
- 《剑指offer》-构建乘积数组
- 剑指offer 构建乘积数组
- 构建乘积数组--剑指Offer
- 【剑指offer】构建乘积数组
- 《剑指offer》构建乘积数组
- 剑指offer-构建乘积数组
- 剑指offer--构建乘积数组
- 构建乘积数组 剑指offer
- 剑指offer-构建乘积数组
- 剑指offer:构建乘积数组
- java URL转PDF文件
- 205. Isomorphic Strings
- JVM垃圾回收
- 获取搜狗引擎 添加任意关键词 后的html源码(c#)
- sysbench压力测试工具使用
- 剑指offer:构建乘积数组
- leetcode_068 Text Justification
- android使用pull解析器来解析和生成xml文件
- leetcode Plan For This Week
- 重载和重写的区别
- HDU 1698 JUST a hook (线段树 成段替换 区间求和 延迟标记)
- 文件指针定位--fseek,ftell
- oracle 10g 11g 12c区别
- Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义