1
1
"""
2
2
Constraints:
3
- 1. 2 <= nums.length <= 10^5
4
- 2. -30 <= nums[i] <= 30
5
- 3. The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer
3
+ - 나눗셈 연산 사용 불가능
4
+ - O(n) 시간 복잡도로 구현해야 함
5
+ - 모든 prefix/ suffix 곱은 32비트 정수 범위 내에 있음
6
6
7
7
Time Complexity: O(n)
8
- - 배열을 두 번 순회하므로 O(n)
8
+ - 배열을 두 번만 순회
9
9
10
10
Space Complexity: O(1)
11
- - 출력 배열(answer)을 제외하면 추가 공간이 상수만큼만 필요 (left, right 변수)
11
+ - 출력 배열 외 추가 공간은 상수만 사용 (left, right 변수)
12
12
13
13
풀이 방법:
14
- 1. answer 배열을 1로 초기화 (곱셈에서는 1이 영향을 주지 않음)
15
- 2. 왼쪽에서 오른쪽으로 순회:
16
- - answer[i]에 현재까지의 left 누적값을 곱함
17
- - left *= nums[i]로 다음을 위해 left 값을 업데이트
18
- 3. 오른쪽에서 왼쪽으로 순회 (range(n-1, -1, -1) 사용):
19
- - answer[i]에 현재까지의 right 누적값을 곱함
20
- - right *= nums[i]로 다음을 위해 right 값을 업데이트
14
+ - 각 위치의 결과는 (왼쪽 모든 요소의 곱) * (오른쪽 모든 요소의 곱)
15
+ - 두 번의 순회로 이를 계산:
16
+ 1. 왼쪽 -> 오른쪽: 각 위치에 왼쪽 모든 요소의 누적 곱 저장
17
+ 2. 오른쪽 -> 왼쪽: 각 위치에 오른쪽 모든 요소의 누적 곱을 곱함
18
+
19
+ 예시: nums = [1, 2, 3, 4]
20
+ 1단계 후: answer = [1, 1, 2, 6]
21
+ 2단계 후: answer = [24, 12, 8, 6]
21
22
"""
22
23
24
+ # Final result = (product of all elements on the left side) * (product of all elements on the right side)
25
+
26
+ # Step 1: Initialize result array with 1s
27
+ # Step 2: Traverse from left to right, storing cumulative product of left side
28
+ # Step 3: Traverse from right to left, multiplying with cumulative product of right side
29
+ # nums = [1,2,3,4]
23
30
class Solution :
24
31
def productExceptSelf (self , nums : List [int ]) -> List [int ]:
25
32
n = len (nums )
@@ -29,10 +36,11 @@ def productExceptSelf(self, nums: List[int]) -> List[int]:
29
36
for i in range (n ):
30
37
answer [i ] *= left
31
38
left *= nums [i ]
32
-
39
+ # answer = [1, 1, 2, 6] at this point
33
40
right = 1
34
41
for i in range (n - 1 , - 1 , - 1 ):
35
42
answer [i ] *= right
36
43
right *= nums [i ]
37
-
44
+
38
45
return answer
46
+ # answer = [24,12,8,6]
0 commit comments