Skip to content

Commit 6274883

Browse files
committed
feat: product-of-array solve with prefix, suffix product
1 parent 62b973f commit 6274883

File tree

1 file changed

+50
-3
lines changed

1 file changed

+50
-3
lines changed

product-of-array-except-self/haxr369.java

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,59 @@
22
import java.util.Map;
33

44
class Solution {
5+
56
/**
6-
* 풀이요약: 범위를 반씩 나누며 곱을 캐싱하고, 제외할 인덱스만 골라 탐색하는 분할 정복 기반 배타 곱 계산
7-
*
7+
* 풀이요약: 좌우로 누적곱하는 배역을 만들고, i를 제외한 좌우 범위 누적곱을 곱한다.
8+
* prefix-product와 suffix-product를 구하기
89
*
910
* 풀이결과:
10-
*
11+
* Runtime: 3 ms (Beats 21.34%)
12+
* Memory: 64.97 MB (Beats 19.65%)
13+
* Space Complexity: O(N)
14+
* - 길이가 N인 배열을 3개를 만들기
15+
* > O(N) + O(N) + O(N) > O(N)
16+
* Time Complexity: O(N)
17+
* - 길이 N인 배열 2번 순회하기 > O(N)
18+
* - 0~N을 순회하면서 누적곱 곱하기 > O(N)
19+
* > O(N) + O(N) > O(N)
20+
*/
21+
public int[] productExceptSelf(int[] nums) {
22+
int L = nums.length;
23+
int[] leftAccMul = new int[L];
24+
int[] rightAccMul = new int[L];
25+
int[] ans = new int[L];
26+
27+
// 0부터 누적곱하기
28+
leftAccMul[0] = nums[0];
29+
for (int i = 1; i < L; i++) {
30+
leftAccMul[i] = leftAccMul[i - 1] * nums[i];
31+
}
32+
33+
// L-1부터 누적곱하기
34+
rightAccMul[L - 1] = nums[L - 1];
35+
for (int i = L - 2; i >= 0; i--) {
36+
rightAccMul[i] = rightAccMul[i + 1] * nums[i];
37+
}
38+
39+
// i를 제외한 누적곱을 곱하기
40+
for (int i = 0; i < L; i++) {
41+
int val = 1;
42+
if (i == 0) { // 오른쪽 누적곱만 곱하기
43+
val *= rightAccMul[i + 1]; // i+1 ~ L-1까지 곱한 값
44+
} else if (i == L - 1) { // 왼쪽 누적곱만 곱하기
45+
val *= leftAccMul[i - 1]; // 0~L-2까지 곱한 값
46+
} else {
47+
val *= leftAccMul[i - 1] * rightAccMul[i + 1];
48+
}
49+
ans[i] = val;
50+
}
51+
return ans;
52+
}
53+
54+
/**
55+
* 풀이요약: 범위를 반씩 나누며 곱을 캐싱하고, 제외할 인덱스만 골라 탐색하는 분할 정복 기반 배타 곱 계산
56+
*
57+
* 풀이결과:
1158
* Runtime: 872 ms (Beats 3.62%)
1259
* Memory: 137.29 MB (Beats 5.61%)
1360
* Space Complexity: O(NlogN)

0 commit comments

Comments
 (0)