15. 3Sum (Medium) (https://leetcode.com/problems/3sum/)
Дан массив целых чисел nums, верните все триплеты [nums[i], nums[j], nums[k]] такие, что i != j, i != k, и j != k, и nums[i] + nums[j] + nums[k] == 0. Набор решений не должен содержать дублирующихся триплетов. Вы можете вернуть результат в любом порядке. Ограничения: 3 <= nums.length <= 3000 -10^5 <= nums[i] <= 10
function threeSum(nums: number[]): number[][] {
const triplets: number[][] = []
nums.sort((a, b) => a - b)
for (let i = 0; i < nums.length; i++) {
let leftIdx = i + 1,
rightIdx = nums.length - 1
if (i > 0 && nums[i] === nums[i - 1]) continue
while (leftIdx < rightIdx) {
const sm = nums[i] + nums[leftIdx] + nums[rightIdx]
if (sm === 0) {
triplets.push([nums[i], nums[leftIdx], nums[rightIdx]])
leftIdx++
rightIdx--
// пропускаем одинаковые left значения
while (leftIdx < rightIdx && nums[leftIdx] === nums[leftIdx - 1]) {
leftIdx++
}
// пропускаем одинаковые right значения
while (leftIdx < rightIdx && nums[rightIdx] === nums[rightIdx + 1]) {
rightIdx--
}
} else if (sm > 0) {
rightIdx--
} else {
leftIdx++
}
}
}
return triplets
}
// Local check:
console.log(threeSum([-1, 0, 1, 2, -1, -4]))
console.log(threeSum([0, 1, 1]))
console.log(threeSum([0, 0, 0]))Пример 1:
Вход: nums = [-1,0,1,2,-1,-4]
Выход: [[-1,-1,2],[-1,0,1]]
Пример 2:
Вход: nums = [0,1,1]
Выход: []
Пример 3:
Вход: nums = [0,0,0]
Выход: [[0,0,0]]