[剑指 Offer 第 2 版第 66 题] “构建乘积数组”做题记录
[剑指 Offer 第 2 版第 66 题] “构建乘积数组”做题记录
第 66 题:构建乘积数组
传送门:构建乘积数组,牛客网 online judge 地址。
给定一个数组
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]
。不能使用除法。
样例:
输入:
[1, 2, 3, 4, 5]
输出:
[120, 60, 40, 30, 24]
思考题:
- 能不能只使用常数空间?(除了输出的数组之外)
思路:使用矩阵法求解,将矩阵分为上三角矩阵和下三角矩阵,分别求乘积。
Python 代码:
class Solution(object):
def multiply(self, A):
"""
:type A: List[int]
:rtype: List[int]
"""
l = len(A)
if l == 0:
return []
b = [None for _ in range(l)]
b[0] = 1
# 计算下三角连乘的结果
for i in range(1, l):
b[i] = b[i - 1] * A[i - 1]
temp = 1
for i in range(l - 2, -1, -1):
temp *= A[i + 1]
b[i] *= temp
return b
Python 代码:
# 66、构建乘积数组
class Solution(object):
def multiply(self, A):
"""
:type A: List[int]
:rtype: List[int]
"""
l = len(A)
if l == 0:
return []
b = [1 for _ in range(l)]
temp = 1
for index in range(l):
b[index] *= temp
temp *= A[index]
temp = 1
for index in range(l - 1, -1, -1):
b[index] *= temp
temp *= A[index]
return b
Java 代码:
C++ 代码:
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
vector<int>left(A.size(),1);
vector<int>right(A.size(),1);
for(int i = 1;i<A.size();i++){
left[i] = A[i-1]*left[i-1];
}
for(int i = A.size()-2;i>=0;i--){
right[i] = A[i+1]*right[i+1];
}
vector<int>B(A.size(),0);
for(int i = 0;i<A.size();i++){
B[i] = left[i]*right[i];
}
return B;
}
};
作者:cornerCao 链接:https://www.acwing.com/solution/AcWing/content/759/ 来源:AcWing 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:liweiwei1419
来源:https://liweiwei1419.github.io/sword-for-offer/
看完两件小事
如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:
- 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
- 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
本文著作权归作者所有,如若转载,请注明出处
转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com