11"""
22Constraints:
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비트 정수 범위 내에 있음
66
77Time Complexity: O(n)
8- - 배열을 두 번 순회하므로 O(n)
8+ - 배열을 두 번만 순회
99
1010Space Complexity: O(1)
11- - 출력 배열(answer)을 제외하면 추가 공간이 상수만큼만 필요 (left, right 변수)
11+ - 출력 배열 외 추가 공간은 상수만 사용 (left, right 변수)
1212
1313풀이 방법:
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]
2122"""
2223
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]
2330class Solution :
2431 def productExceptSelf (self , nums : List [int ]) -> List [int ]:
2532 n = len (nums )
@@ -29,10 +36,11 @@ def productExceptSelf(self, nums: List[int]) -> List[int]:
2936 for i in range (n ):
3037 answer [i ] *= left
3138 left *= nums [i ]
32-
39+ # answer = [1, 1, 2, 6] at this point
3340 right = 1
3441 for i in range (n - 1 , - 1 , - 1 ):
3542 answer [i ] *= right
3643 right *= nums [i ]
37-
44+
3845 return answer
46+ # answer = [24,12,8,6]
0 commit comments