給你一個整數數組 nums,判斷是否存在三元組 [nums [i], nums [j], nums [k]] 滿足 i != j、i != k 且 j != k ,同時還滿足 nums [i] + nums [j] + nums [k] == 0 。請你返回所有和為 0 且不重複的三元組。
注意:答案中不可以包含重複的三元組。
示例 1:
輸入:nums = [-1,0,1,2,-1,-4]
輸出:[[-1,-1,2],[-1,0,1]]
解釋:
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 。
不同的三元組是 [-1,0,1] 和 [-1,-1,2] 。
注意,輸出的順序和三元組的順序並不重要。
示例 2:
輸入:nums = [0,1,1]
輸出:[]
解釋:唯一可能的三元組和不為 0 。
示例 3:
輸入:nums = [0,0,0]
輸出:[[0,0,0]]
解釋:唯一可能的三元組和為 0 。
解法 1:雙指針
func threeSum(nums []int) (ans [][]int) {
sort.Ints(nums)
n := len(nums)
for i, x := range nums[:n-2] {
if i > 0 && x == nums[i-1] { // 跳過重複數字
continue
}
if x+nums[i+1]+nums[i+2] > 0 { // 優化一
break
}
if x+nums[n-2]+nums[n-1] < 0 { // 優化二
continue
}
j, k := i+1, n-1
for j < k {
s := x + nums[j] + nums[k]
if s > 0 {
k--
} else if s < 0 {
j++
} else {
ans = append(ans, []int{x, nums[j], nums[k]})
for j++; j < k && nums[j] == nums[j-1]; j++ {} // 跳過重複數字
for k--; k > j && nums[k] == nums[k+1]; k-- {} // 跳過重複數字
}
}
}
return
}