-
주제 : Sword는 Offer66을 참조합니다. 제품 배열 생성
배열 a를 입력하여 배열 b를 반환하고 b [i] = a [i]를 제외한 배열 a에있는 모든 요소의 곱 -
아이디어 :
1. dp 트래버스 두 번 : O (n), O (1)
일반적인 아이디어 : b [i]는 b [i-1]을 기준으로 a [i-1]을 곱하고 a를 나누는 것과 같습니다. [i], 따라서 O (n)을 한 번만 통과하면됩니다.
이 질문은 나눗셈을 사용할 수 없습니다. b [i]와 b [i-1]의 차이 만 보면 왼쪽에서 오른쪽으로 이동하는 것을 생각하면됩니다. ] 왼쪽에는 b [i-1]에 있습니다. a [i-1]을 하나 더 곱하면됩니다. 그러나 오른쪽의 차이는 b [i]를 제외합니다. 그러나 우리가 생각하면 반대로, 즉 b [i-1]은 b [i] a [i]의 곱셈을 하나 더 기준으로합니다. 따라서 왼쪽에서 오른쪽으로 이동하여 먼저 왼쪽 곱을 계산 한 다음 오른쪽에서 왼쪽으로 이동하여 오른쪽 곱을 계산하므로 곱셈 만 사용됩니다.
class Solution {
public:
vector<int> constructArr(vector<int>& a) {
int n = a.size();
vector<int> b(n, 1);//b[i]=a[i]左侧的乘积*a[r]右侧的乘积=a[0]*...*a[i-1]*a[i+1]*...*a[n-1]
for (int i = 0, l = 1; i < n; ++i) {
//从左往右遍历:求出a[i]侧的乘积
b[i] *= l;
l *= a[i];
}
for (int i = n - 1, r = 1; i >= 0; --i) {
//从右往左遍历:再乘上a[i]右侧的乘积
b[i] *= r;
r *= a[i];
}
return b;
}
};