🔊
파이썬 알고리즘 인터뷰
책을 참고했습니다.
배열을 입력받아 합으로 0을 만들 수 있는 요소 값들을 리스트에 넣어서 반환하라. 중복값은 제외시켜야만 한다.
못품..타임아웃
타임아웃 풀이
투 포인터를 이용한 O(n^2) 최적화
첫번째 숫자를 정해두고 나머지 두개는 투 포인터를 이용해서 구하면 O(n^2)만에 답을 구할수 있다.
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
ret = []
nums.sort()
for i in range(len(nums)):
left, right = i + 1, len(nums) - 1
while left < right:
sm = nums[i] + nums[left] + nums[right]
if sm < 0:
left += 1
elif sm > 0:
right -= 1
else:
temp = [nums[i], nums[left], nums[right]]
if temp not in ret:
ret.append(temp)
left += 1
right -= 1
return ret
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
ret = []
nums.sort()
for i in range(len(nums)):
if i > 0 and nums[i] == nums[i - 1]:
continue
left, right = i + 1, len(nums) - 1
while left < right:
sm = nums[i] + nums[left] + nums[right]
if sm < 0:
left += 1
elif sm > 0:
right -= 1
else:
temp = [nums[i], nums[left], nums[right]]
ret.append(temp)
# 중복 검사를 따로 진행해서 쓸데없는 연산을 없앨 수 있다.
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 ret
투 포인터
를 통해 해결할 수 있다.반드시 중복검사를 통해서 똑같은 수를 없애고 같은 숫자들 중 마지막에 있는 것만 i가 인덱스로 가져야한다. 그래야 left와 i 인덱스의 값이 서로 다른 값을 가질 수 있다.