Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums = sorted(nums)
res = []
if len(nums) < 3:
return res
for i in range(len(nums)):
needs = 0 - nums[i]
for j in range(i+1, len(nums)):
need = needs - nums[j]
tmp_nums = nums[:]
tmp_nums.remove(nums[i])
tmp_nums.remove(nums[j])
if need in tmp_nums:
answer = [nums[i], nums[j], need]
if sorted(answer) not in res:
res.append(answer)
return res
์ฃผ์ด์ง ๋ฐฐ์ด nums
์์ ๋ํ๋ฉด 0์ด ๋๋ 3๊ฐ์ ์ซ์ set์ ๊ตฌํ์ฌ ๋ฆฌํดํ๋ ๋ฌธ์ ์ด๋ค.
๋๋ ์ฐ์ nums
๋ฅผ ์ ๋ ฌ์ํจ ๋ค์ for๋ฌธ์ ๋๋ฉฐ i
๊ฐ 0์ด ๋๊ธฐ ์ํด ํ์ํ ๋ ์๋ฅผ ์ฐพ์๋ด๋ฉด answer
์ ๋ํ๋ ์์ผ๋ก ํด๊ฒฐํ๋๋ฐ ๊ฒฐ๊ตญ Time Limit์ ๊ฑธ๋ ธ๋ค.
์ด์ฐ๋ณด๋ฉด ๋น์ฐํ๊ฒ ์ ๋ ฌ ํ ์ด์ค for๋ฌธ์์ if๋ฌธ์ผ๋ก tmp_nums
๋ฅผ ๋ ํ์ํ๋ ์ฝ๋์ด๊ธฐ ๋๋ฌธ์ ๋๋ฆด ์๋ฐ์ ์์๋ค.
def threeSum(self, nums: List[int]) -> List[List[int]]:
res = []
nums.sort()
length = len(nums)
for i in range(length-2):
if nums[i] > 0:
break
if i > 0 and nums[i] == nums[i-1]:
continue
l, r = i + 1, length - 1
while l < r:
total = nums[i] + nums[l] + nums[r]
if total < 0:
l += 1
elif total > 0:
r -= 1
else:
res.append([nums[i], nums[l], nums[r]])
while l < r and nums[l] == nums[l+1]:
l += 1
while l < r and nums[r] == nums[r-1]:
r -= 1
l += 1
r -= 1
return res
์ด ๋ถ์ ์ฐ์ ์ ๋ ฌํ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ๊ฐ์ด ์์์ธ ๊ฒฝ์ฐ ๋ฐ๋ก ๋ฆฌํดํ๋ค. ์์๊ฐ ์์ผ๋ฉด ์๋ฌด๋ฆฌ ์กฐํฉํด๋ 0์ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ค์์ผ๋ก ํ์ฌ ๊ฐ๊ณผ ๋ฐ๋ก ์ ๊ฐ์ด ๋์ผํ๋ฉด ์ง๋์น๋ค.
ํ์ฌ ์ธ๋ฑ์ค์ 1์ ๋ํ ๊ฐ์ l
, ์ด ๊ธธ์ด์์ 1์ ๋บ ๊ฐ(=๋ฐฐ์ด์ ์ด ์ธ๋ฑ์ค)์ r
์ ์ ์ฅํ๋ค.
l
์ด r
๋ณด๋ค ์์ ๋์ while๋ฌธ์ ๋ฐ๋ณตํ๋ค.
๋ฐฐ์ด์ ํ์ฌ ๊ฐ๊ณผ ๋ค์ ๊ฐ, ๋ง์ง๋ง ๊ฐ์ ๋ํ์ฌ total
์ ์ ์ฅํ๊ณ ๊ทธ ๊ฐ์ด ์์์ธ ๊ฒฝ์ฐ l
์ ์ฆ๊ฐ์ํค๊ณ ์์์ธ ๊ฒฝ์ฐ r
์ ๊ฐ์์ํจ๋ค.
์ธ ๊ฐ์ ํฉ์ด 0์ธ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๊ฐ์ ์ถ๊ฐํ๊ณ l
๊ฐ๊ณผ r
๊ฐ์ ์กฐ์ ํ๋ค.
๋๋จธ์ง ๋ ์ซ์๋ฅผ ๋ฌด์์ ๊ฐ์ ๋ฐฐ์ด์ for๋ฌธ์ผ๋ก ๋์ง ์๊ณ ์ด๊ธฐํํ ํ ์ธ๋ฑ์ค๋ฅผ ์กฐ์ ํ๋ฉฐ ์ฐพ์๊ฐ๋ ํจ์ฌ ๋น ๋ฅด๋ค.