标签:沟通 思路 奇数位于偶数前面 heap 逆序 要求 return 二维 归并
重磅干货,第一时间送达构建乘积数组
给定一个数组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]。
不能使用除法。
为了方便理解题目,下面举个例子
A=[1, 2 , 3, 4]
B=[234, 134, 124, 123]
如果可以用除法的话:那就比较容易了
所以不能使用除法,那就只能从乘法角度来看这道题目了。
如上图所示,可以发现:
B[i]的左半部分(红色部分)和B[i-1]有关(将B[i]的左半部分乘积看成C[i],有C[i]=C[i-1]*A[i-1]),
B[i]的右半部分(紫色部分)与B[i+1]有关(将B[i]的右半部分乘积看成D[i],有D[i]=D[i+1]*A[i+1]
因此我们先从0到n-1遍历,计算每个B[i]的左半部分; 然后定义一个变量temp代表右半部分的乘积,从n-1到0遍历,令B[i]=temp,而每次的temp与上次的temp关系即为temp=A[i+1]。
Python :
class Solution:
def multiply(self, A):
# write code here
B=[1]*len(A)
for i in range(1,len(A)):
B[i]=B[i-1]*A[i-1]
tmp=1
for j in range(len(A)-2,-1,-1):
tmp *= A[j+1]
B[j]*= tmp
return B
C++
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
vector<int> B;
int length = A.size();
for(int i=0;i<length;i++)
{
int number=1;
for(int j = 0;j<length;j++){
if(j==i)continue;
number *= A[j];
}
B.push_back(number);
}
return B;
}
};
JAVA
public class Solution {
public int[] multiply(int[] A) {
if(A.length <= 1)
return A;
int [] B = new int[A.length];
B[0] = 1;
for(int i = 1; i < A.length; i++){
B[i] = B[i-1] * A[i-1];
}
int temp = 1;
for(int j = A.length - 2; j>=0; j--){
temp *= A[j+1];
B[j] *= temp;
}
return B;
}
}
注:面试季来了,不管是作为面试者还是以后作为面试官,了解算法这门程序员之间的沟通方式都是非常必要的。找过工作的朋友应该都听说过《剑指offer》,虽然书中只有六十多道题目,但是道道都是经典。
如果是单纯的面试需求,剑指offer的优先级肯定是在Leetcode之前,总的说它有三个优点:
它的缺点是:
剑指offer刷题交流群
扫码添加微信,一定要备注研究方向+地点+学校+昵称(如机器学习+上海+上交+汤姆)
▲长按加群
标签:沟通 思路 奇数位于偶数前面 heap 逆序 要求 return 二维 归并
原文地址:https://blog.51cto.com/15054042/2564442