- 操作系统:ubuntu22.04
- IDE:Visual Studio Code
- 编程语言:C++11
题目描述
给你一个数组 A,比如 [1,2,3,4,5],你要返回一个新的数组 B。
B 中的每一个元素 B[i] 是 A 中除了 A[i] 以外所有元素的乘积。
不能使用除法。
假设输入是:
A = [1, 2, 3, 4, 5]
我们要构造一个新数组 B,其中:
B[0] = 2 × 3 × 4 × 5 = 120
B[1] = 1 × 3 × 4 × 5 = 60
B[2] = 1 × 2 × 4 × 5 = 40
B[3] = 1 × 2 × 3 × 5 = 30
B[4] = 1 × 2 × 3 × 4 = 24
所以输出是:
B = [120, 60, 40, 30, 24]
解决思路
我们把每个 B[i] 分成两部分来计算:
- 左边乘积:从 A[0] 到 A[i-1] 的乘积
- 右边乘积:从 A[i+1] 到 A[n-1] 的乘积
然后把它们相乘就是结果。
代码
#include <vector>
using namespace std;
class Solution {
public:
vector< int > constructArr( vector< int >& A )
{
int n = A.size();
if ( n == 0 )
return {};
vector< int > B( n, 1 );
// 第一次遍历:计算左边乘积
int left = 1;
for ( int i = 0; i < n; ++i )
{
B[ i ] *= left;
left *= A[ i ];
}
// 第二次遍历:乘上右边乘积
int right = 1;
for ( int i = n - 1; i >= 0; --i )
{
B[ i ] *= right;
right *= A[ i ];
}
return B;
}
};
int main()
{
Solution s;
vector< int > A = { 1, 2, 3, 4, 5 };
vector< int > B = s.constructArr( A );
for ( int i = 0; i < B.size(); ++i )
{
cout << B[ i ] << " ";
}
cout << endl;
return 0;
}
运行结果
120 60 40 30 24