LeetCode - 15. 3Sum (Python)

조민수·2024년 6월 5일
0

LeetCode

목록 보기
18/64
post-custom-banner

Medium, 투 포인터

RunTime : 699 ms / Memory : 20.61 MB


문제

Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.

Notice that the solution set must not contain duplicate triplets.


풀이

  1. 시간초과 발생한 백트래킹
  • 문제를 보자마자 백트래킹으로 풀었는데, 시간초과가 났다.
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        res = []
        nums.sort()

        def dfs(idx, out):
            if len(out) == 3:
                if sum(out) == 0:
                    res.append(out[:])
                return
                
            for i in range(idx, len(nums)):
                if i > idx and nums[i] == nums[i - 1]:
                    continue
                out.append(nums[i])
                dfs(i + 1, out)
                out.pop()
        
        dfs(0, [])
        return res
  1. 답 참조 - 투 포인터
  • 답을 만들 때, 3개의 값을 골라야 해서 투 포인터라고 생각을 못했다.
    • Medium인데 어렵네
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        res = []
        nums.sort()

        for i in range(len(nums) - 2):
            if i > 0 and nums[i] == nums[i - 1]:
                # 중복제거
                continue
            
            left, right = i + 1, len(nums) - 1

            while left < right:
                total = nums[i] + nums[left] + nums[right]
                if total < 0:
                    # 더 큰 수 필요
                    left += 1
                elif total > 0:
                    right -= 1
                else:
                    res.append([nums[i], nums[left], nums[right]])
                    while left < right and nums[left] == nums[left + 1]:
                        left += 1
                    while left < right and nums[right] == nums[right - 1]:
                        right -= 1
                    left += 1
                    right -= 1
                    
        return res
profile
사람을 좋아하는 Front-End 개발자
post-custom-banner

0개의 댓글