【剑指 Offer 题解】66.构建乘积数组

编程入门 行业动态 更新时间:2024-10-26 23:40:36

【剑指 Offer 题解】66.构建<a href=https://www.elefans.com/category/jswz/34/1767703.html style=乘积数组"/>

【剑指 Offer 题解】66.构建乘积数组

题目描述

给定一个数组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、若使用可以使用除法,B[i] = 总乘积 / A[i]
2、若暴力解决,连乘后时间复杂度为 O(N^2) ,效率过低
3、B[i] = A[i] 左边连乘 × A[i]右边连乘 = C[i] × D[i]
4、任务分解,计算 C[i] = A[0]×A[1]×… ×A[i-1]

int[] C = new int[n];
int temp = 1;
for (int i = 0; i < n; i++) {C[i] = temp;temp = temp * A[i];
}

5、计算 D[i] = A[i+1]×…×A[n-1]

int[] D = new int[n];
int temp = 1;
for (int i = n-1; i >= 0; i--) {D[i] = temp;temp = temp * A[i];
}

6、计算B[i] = C[i] × D[i]

int[] C = new int[n];
int temp = 1;
for (int i = 0; i < n; i++) {C[i] = temp;temp = temp * A[i];
}
int[] D = new int[n];
temp = 1;
for (int i = n-1; i >= 0; i--) {D[i] = temp;temp = temp * A[i];
}
for (int i = 0; i < n; i++) {B[i] = C[i] * D[i];
}

至此,问题解决。

优化

但观察代码发现,循环计算B[i]时,并未对D[i]修改,是否可以直接在第二个循环中,计算出B[i]呢。

int[] C = new int[n];
int temp = 1;
for (int i = 0; i < n; i++) {C[i] = temp;temp = temp * A[i];
}
temp = 1;
for (int i = n-1; i >= 0; i--) {//D[i] = temp;//B[i] = C[i] * D[i];B[i] = C[i] * temp;temp = temp * A[i];
}

再观察,发现C[i]分配空间只是为了存储前面的乘积,是否也可以直接将值存储在B[i]中。

int temp = 1;
for (int i = 0; i < n; i++) {B[i] = temp;temp = temp * A[i];
}
temp = 1;
for (int i = n-1; i >= 0; i--) {B[i] = B[i] * temp;temp = temp * A[i];
}

至此,问题完美解决。

更多推荐

【剑指 Offer 题解】66.构建乘积数组

本文发布于:2024-03-06 06:01:14,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1714549.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:乘积   题解   数组   剑指   Offer

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!