题目链接:https://leetcode.cn/problems/gou-jian-cheng-ji-shu-zu-lcof/
1. 题目介绍(66. 构建乘积数组)
给定一个数组 A[0,1,…,n-1]
,请构建一个数组 B[0,1,…,n-1]
,其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]
。不能使用除法。
【测试用例】:
【条件约束】:
2. 题解
2.1 乘积矩阵 – O(n) ⭐
时间复杂度O(n),空间复杂度O(1)
【解题思路】:
除法: 如果没有不能使用除法的限制,我们则可以使用公式 (A[0] * A[1] * ... * A[n-1] ) / A[i]
来求得 B[i];在使用除法时,只需要注意 A[i] 等于 0 的情况即可。
……
乘积数组:我们可以将 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]
分成两部分,一部分定义为 C[i] = A[0]×A[1]×...×A[i-1]
= C[i-1] ×A[i-1];另一部分定义为 D[i] = A[i+1]×…×A[n-1]
= D[i+1] × A[i+1]。那么我们就得到了 B[i]= C[i] ×D[i]
……
【实现策略】:
- 首选获取输入数组的长度
len1
,进行无效输入的判断; - 定义数组
B
, 用来存储返回结果; - 第一次循环,让
B[i]
累乘为 C[i]
; - 第二次循环,让
B[i]
累乘为 C[i] * D[i]
; - 最后返回结果。
class Solution {
public int[] constructArr(int[] a) {
int len1 = a.length;
if (len1 <= 0) return new int[0];
int[] b = new int[len1];
b[0] = 1;
for (int i = 1; i < len1; i++) {
b[i] = b[i-1] * a[i-1];
}
int temp = 1;
for (int j = len1-2; j >= 0; j--) {
temp *= a[j+1];
b[j] *= temp;
}
return b;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)