add new solutions
This commit is contained in:
parent
ccb8b5673b
commit
58527849b2
6 changed files with 202 additions and 0 deletions
65
solutions/0/q15/solution.go
Normal file
65
solutions/0/q15/solution.go
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
package q15
|
||||
|
||||
import "slices"
|
||||
|
||||
func sortAndDedup3(nums []int) []int {
|
||||
slices.Sort(nums)
|
||||
head, dup := 0, 0
|
||||
for i := 1; i < len(nums); i++ {
|
||||
if nums[i] == nums[head] {
|
||||
dup++
|
||||
} else {
|
||||
dup = 0
|
||||
}
|
||||
if dup < 3 {
|
||||
head++
|
||||
nums[head] = nums[i]
|
||||
}
|
||||
}
|
||||
return nums[:head+1]
|
||||
}
|
||||
|
||||
func threeSum(nums []int) [][]int {
|
||||
nums = sortAndDedup3(nums)
|
||||
ret := [][]int{}
|
||||
|
||||
appendResult := func(a, b, c int) {
|
||||
triplet := []int{a, b, c}
|
||||
if len(ret) > 0 && slices.Equal(triplet, ret[len(ret)-1]) {
|
||||
return
|
||||
}
|
||||
ret = append(ret, triplet)
|
||||
}
|
||||
|
||||
for i := 0; i < len(nums)-2; i++ {
|
||||
if nums[i] > 0 {
|
||||
break
|
||||
}
|
||||
wants := -nums[i]
|
||||
l, r := i+1, len(nums)-1
|
||||
for l < r {
|
||||
for l < r && nums[l]+nums[r] > wants {
|
||||
r--
|
||||
}
|
||||
if l < r && nums[l]+nums[r] == wants {
|
||||
appendResult(nums[i], nums[l], nums[r])
|
||||
r--
|
||||
}
|
||||
for l < r && nums[l]+nums[r] < wants {
|
||||
l++
|
||||
}
|
||||
if l < r && nums[l]+nums[r] == wants {
|
||||
appendResult(nums[i], nums[l], nums[r])
|
||||
l++
|
||||
}
|
||||
}
|
||||
|
||||
// skip same numbers
|
||||
for ; i < len(nums)-2 && nums[i] == nums[i+1]; i++ {
|
||||
}
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
var _ = threeSum
|
||||
Loading…
Add table
Add a link
Reference in a new issue