33
44class 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