15. 3Sum
https://leetcode.com/problems/3sum/
js
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
nums.sort((a, b) => a - b)
var result = []
for (let i = 0; i < nums.length; i++) {
if (i >= 1 && nums[i] === nums[i - 1]) {
continue
}
let left = i + 1
let right = nums.length - 1
while (left < right) {
let sum = nums[left] + nums[right] + nums[i]
if (sum === 0) {
result.push([nums[i], nums[left], nums[right]])
left++
right--
while (left < right && nums[left] === nums[left - 1]) {
left++
}
while (left < right && nums[right] === nums[right + 1]) {
right--
}
} else if (sum < 0) {
left++
while (left < right && nums[left] === nums[left - 1]) {
left++
}
} else {
right--
while (left < right && nums[right] === nums[right + 1]) {
right--
}
}
}
}
return result
}
py
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums.sort()
result = []
for i in range(len(nums) - 2):
if i >= 1 and nums[i] == nums[i - 1]:
continue
left, right = i + 1, len(nums) - 1
while left < right:
a, b, c = nums[i], nums[left], nums[right]
if a + b + c == 0:
result.append([a, b, c])
left += 1
right -= 1
while left < right and nums[left] == nums[left - 1]:
left += 1
while left < right and nums[right] == nums[right + 1]:
right -= 1
elif a + b + c < 0:
left += 1
while left < right and nums[left] == nums[left - 1]:
left += 1
else:
right -= 1
while left < right and nums[right] == nums[right + 1]:
right -= 1
return result