下面要给大家分享的是和数组有关的内容,具体内容为构建乘积数组的思路和代码实现,感兴趣的小伙伴可以来了解一下。
题目:
给定一个数组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[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];
思路1:
分析:
解释下代码,设有数组大小为5。
对于第1个for循环
第1步:b[0] = 1;
第2步:b[1] = b[0] * a[0] = a[0]
第3步:b[2] = b[1] * a[1] = a[0] * a[1];
第4步:b[3] = b[2] * a[2] = a[0] * a[1] * a[2];
第5步:b[4] = b[3] * a[3] = a[0] * a[1] * a[2] * a[3];
然后对于第2个for循环
第1步
temp *= a[4] = a[4];
b[3] = b[3] * temp = a[0] * a[1] * a[2] * a[4];
第2步
temp *= a[3] = a[4] * a[3];
b[2] = b[2] * temp = a[0] * a[1] * a[4] * a[3];
第3步
temp *= a[2] = a[4] * a[3] * a[2];
b[1] = b[1] * temp = a[0] * a[4] * a[3] * a[2];
第4步
temp *= a[1] = a[4] * a[3] * a[2] * a[1];
b[0] = b[0] * temp = a[4] * a[3] * a[2] * a[1];
由此可以看出从b[4]到b[0]均已经得到正确计算。
代码实现:
class Solution { public: vector < int > multiply(const vector < int > & A) { vector < int > vec; int sz = A.size(); if (sz == 0) return vec; vec.push_back(1); for (int i = 0; i < sz - 1; i++) vec.push_back(vec.back() * A[i]); int tmp = 1; for (int i = sz - 1; i >= 0; i--) { vec[i] = vec[i] * tmp; tmp = tmp * A[i]; } return vec; } };
思路2:
B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]
从左往右算 B[i]=A[0]*A[1]*...*A[i-1]
从右往左算B[i]*=A[i+1]*...*A[n-1]
代码实现:
class Solution { public: vector < int > multiply(const vector < int > & A) { int n = A.size(); vector < int > b(n); int ret = 1; for (int i = 0; i < n; ret *= A[i++]) { b[i] = ret; } ret = 1; for (int i = n - 1; i >= 0; ret *= A[i--]) { b[i] *= ret; } return b; } };
思路3:
B[i]的值可以看作下图的矩阵中每行的乘积。
下三角用连乘可以很容求得,上三角,从下向上也是连乘。
所以,思路就非常清晰了,先算下三角中的连乘,即我们先算出B[i]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。
代码实现:
public class Solution { public int[] multiply(int[] A) { int length = A.length; int[] B = new int[length]; if (length != 0) { B[0] = 1; //计算下三角连乘 for (int i = 1; i < length; i++) { B[i] = B[i - 1] * A[i - 1]; } int temp = 1; //计算上三角 for (int j = length - 2; j >= 0; j--) { temp *= A[j + 1]; B[j] *= temp; } } return B; } }
构建乘积数组的思路和代码实现大家都清楚了吗?以上内容大家可以参考一下,希望可以帮助到大家。
更多的Java实例,可以继续关注本站的Java实例专栏了解哦。