|
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 |
2 | 56 |
|
| 57 | + return result |
| 58 | + |
| 59 | + |
| 60 | + |
| 61 | +# O(n^2) time, O(n) space |
3 | 62 | class Solution:
|
4 | 63 | def threeSum(self, nums: List[int]) -> List[List[int]]:
|
5 | 64 | triplets = set()
|
|
0 commit comments