Skip to content

Commit dfdc227

Browse files
committed
3sum sol (py)
1 parent ec12b17 commit dfdc227

File tree

1 file changed

+60
-1
lines changed

1 file changed

+60
-1
lines changed

3sum/hi-rachel.py

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,64 @@
1-
# O(n^2) time, O(n) space
1+
"""
2+
https://leetcode.com/problems/3sum/
3+
4+
문제 설명:
5+
정렬되지 않은 정수 배열 nums가 주어질 때,
6+
세 수의 합이 0이 되는 모든 유니크한 triplet을 찾는 문제.
7+
8+
조건:
9+
- 중복 조합은 허용되지 않음.
10+
- 예: [-1, 0, 1]과 [0, -1, 1]은 같은 조합이므로 하나만 포함.
11+
12+
풀이 전략:
13+
1. 배열을 정렬한다.
14+
2. 첫 번째 수를 고정한 뒤, 나머지 두 수를 투포인터로 탐색한다.
15+
- 합이 0보다 작으면 left를 증가
16+
- 합이 0보다 크면 right를 감소
17+
- 합이 0이면 정답에 추가, 중복 방지 처리도 함께 수행
18+
19+
TC: O(n^2), 정렬 O(n log n) + 투포인터 O(n^2)
20+
SC: O(1), 출력 공간 result 제외
21+
"""
22+
23+
from typing import List
24+
25+
26+
class Solution:
27+
def threeSum(self, nums: List[int]) -> List[List[int]]:
28+
nums.sort()
29+
result = []
30+
31+
for i in range(len(nums) - 2):
32+
if i > 0 and nums[i] == nums[i - 1]:
33+
continue # 중복 제거
34+
35+
left, right = i + 1, len(nums) - 1
36+
37+
while left < right:
38+
total = nums[i] + nums[left] + nums[right]
39+
# 조건 만족시 정답에 추가
40+
if total == 0:
41+
result.append([nums[i], nums[left], nums[right]])
42+
# 같은 값을 가진 left가 여러 개 있다면, 중복 건너뜀
43+
while left < right and nums[left] == nums[left + 1]:
44+
left += 1
45+
# 같은 값을 가진 right가 여러 개 있다면, 중복 건너뜀
46+
while left < right and nums[right] == nums[right - 1]:
47+
right -= 1
48+
left += 1
49+
right -= 1
50+
# 총합이 0보다 작으면, 더 큰 수가 필요하니까 left를 오른쪽으로 이동
51+
elif total < 0:
52+
left += 1
53+
# 총합이 0보다 크면, 더 작은 수가 필요하니까 right를 왼쪽으로 이동
54+
else:
55+
right -= 1
256

57+
return result
58+
59+
60+
61+
# O(n^2) time, O(n) space
362
class Solution:
463
def threeSum(self, nums: List[int]) -> List[List[int]]:
564
triplets = set()

0 commit comments

Comments
 (0)