Skip to content

Commit 3158aa4

Browse files
committed
feat: product-of-array 공간복잡도 개선
1 parent 6274883 commit 3158aa4

File tree

1 file changed

+41
-1
lines changed

1 file changed

+41
-1
lines changed

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

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,46 @@
33

44
class Solution {
55

6+
/**
7+
* 풀이요약: 좌우로 누적곱하는 배역을 만들고, i를 제외한 좌우 범위 누적곱을 곱한다.
8+
* prefix-product 배열을 출력 배열로 사용하기
9+
* suffix-product 배열 대신 오른쪽 누적곱을 한 변수로만 관리한다.
10+
*
11+
* 풀이결과:
12+
* Runtime: 2 ms (Beats 89.36%)
13+
* Memory: 72.28 MB (Beats 5.61%)
14+
* Space Complexity: O(1)
15+
* - 길이가 N인 배열을 1개를 만들지만, return에 쓰이므로 카운팅 안됨.
16+
* - suffix-product 게산용 변수 1개
17+
* > O(1) > O(1)
18+
* Time Complexity: O(N)
19+
* - 길이 N인 배열 2번 순회하기 > O(N)
20+
* > O(N) > O(N)
21+
*
22+
*/
23+
public int[] productExceptSelf(int[] nums) {
24+
int L = nums.length;
25+
int[] leftAccMul = new int[L];
26+
27+
// 0부터 누적곱하기
28+
leftAccMul[0] = 1;
29+
for (int i = 1; i < L; i++) {
30+
leftAccMul[i] = leftAccMul[i - 1] * nums[i - 1];
31+
// System.out.println("i->"+i+" val->"+leftAccMul[i]);
32+
}
33+
// System.out.println("--------------");
34+
// L-1부터 누적곱하기
35+
int rightAccMul = nums[L - 1];
36+
for (int i = L - 2; i >= 0; i--) {
37+
// L-1번째 숫자는 suffix-product에서 곱할게 없다..
38+
// 0번째 숫자는 1~L-1 범위 누적곱만 곱해야한다.
39+
leftAccMul[i] *= rightAccMul;
40+
rightAccMul *= nums[i];
41+
// System.out.println("i->"+i+" val->"+leftAccMul[i]);
42+
}
43+
return leftAccMul;
44+
}
45+
646
/**
747
* 풀이요약: 좌우로 누적곱하는 배역을 만들고, i를 제외한 좌우 범위 누적곱을 곱한다.
848
* prefix-product와 suffix-product를 구하기
@@ -18,7 +58,7 @@ class Solution {
1858
* - 0~N을 순회하면서 누적곱 곱하기 > O(N)
1959
* > O(N) + O(N) > O(N)
2060
*/
21-
public int[] productExceptSelf(int[] nums) {
61+
public int[] productExceptSelf2(int[] nums) {
2262
int L = nums.length;
2363
int[] leftAccMul = new int[L];
2464
int[] rightAccMul = new int[L];

0 commit comments

Comments
 (0)