暴力解法,2200ms, 超过5.5%的用户 T.T
func threeSum(nums []int) [][]int {
var r [][]int
L := len(nums)
if L <= 0 {
return r
}
for i := 0; i < L; i++ {
min := i
for j := i; j < L; j++ {
if nums[j] < nums[min] {
min = j
}
}
t := nums[i]
nums[i] = nums[min]
nums[min] = t
}
if nums[0] > 0 || nums[L-1] < 0 {
return r
}
for i := 0; i < L; i++ {
if i > 0 && nums[i] == nums[i-1] {
continue
}
for j := i + 1; j < L; j++ {
if j > i+1 && nums[j] == nums[j-1] {
continue
}
left := nums[i] + nums[j]
for k := L - 1; k > j; k-- {
if k < L-1 && nums[k] == nums[k+1] {
continue
} else if nums[k]+left < 0 {
break
} else if nums[k]+left == 0 {
r = append(r, []int{nums[i], nums[j], nums[k]})
break
}
}
}
}
return r
}
参考评论区大佬解法
func threeSum(nums []int) [][]int {
var res [][]int
L := len(nums)
if L < 3 {
return res
}
for i := 0; i < L; i++ {
min := i
for j := i; j < L; j++ {
if nums[j] < nums[min] {
min = j
}
}
t := nums[i]
nums[i] = nums[min]
nums[min] = t
}
if nums[0] > 0 || nums[L-1] < 0 {
return res
}
for i := 0; i < L; i++ {
target := nums[i]
if target > 0 {
break
}
if i > 0 && nums[i] == nums[i-1] {
continue // 去重
}
l, r := i+1, L-1
for l < r {
sum := nums[l] + nums[r] + target
if sum > 0 {
r--
} else if sum < 0 {
l++
} else if sum == 0 {
res = append(res, []int{target, nums[l], nums[r]})
l++
r--
// 去重
for l < r && nums[l] == nums[l-1] {
l++
}
for l < r && nums[r] == nums[r+1] {
r--
}
}
}
}
return res
}