15. 3-sum
Se-ok Jeon
Posted on October 18, 2024
Constraints
- 3 <= nums.length <= 3000
- -105 <= nums[i] <= 105
Idea #1 (Time: O(N), Memory: O(N))
- sort nums
- iterate if len(nums) > 2
- check duplicate
- left, right setup
- while left < right
- check if 3sum < 0: left++, >0: right--
- 3sum == 0: append 3 elem @ res and check duplicate both left and right, left++, right--
- if done return res, if not go to 2
Test Cases
Example 1:
Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
Explanation:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0.
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0.
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0.
The distinct triplets are [-1,0,1] and [-1,-1,2].
Notice that the order of the output and the order of the triplets does not matter.
Example 2:
Input: nums = [0,1,1]
Output: []
Explanation: The only possible triplet does not sum up to 0.
Example 3:
Input: nums = [0,0,0]
Output: [[0,0,0]]
Explanation: The only possible triplet sums up to 0.
Code
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
res = list()
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:
sum = nums[i] + nums[left] + nums[right]
if sum < 0:
left += 1
elif sum > 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
💖 💪 🙅 🚩
Se-ok Jeon
Posted on October 18, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
githubcopilot AI Innovations at Microsoft Ignite 2024 What You Need to Know (Part 2)
November 29, 2024