Leetcode 15. 三数之和

思路 双指针法
1. 对输入数组进行校验,是否符合输入要求。
2. 对数组进行排序。 检查排序后的第一个元素,如果第一个元素大于零,则它和任何其他两个元素相加都大于零。返回空值。
3. 首先对数组进行遍历,确定第一个元素V1。
4. 对第一个元素之后的其他元素使用双指针法,如果左指针的值+右指针的值+V1大于0,则将右指针向左移。如果左指针的值+右指针的值+V1小于0,则将左指针右移。
5. 如果左指针的值+右指针的值+V1等于0,则记录当前情况。由于需要去重,所以我们需要同时判断:
a. 当前左指针右边的值是否和当前左指针的值相等,如果相等,则将左指针右移直到不相同。
b. 当前右指针左边的值是否和当前右指针的值相等,如果相等,则将右指针左移直到不相同。
6. 返回结果值。
func threeSum(nums []int) [][]int {
length := len(nums)
res := make([][]int, 0)
if length < 3 {
return res
}
sort.Ints(nums)
for i := 0; i < length-2; i++ {
v1 := nums[i]
if v1 > 0 {
break
}
if i > 0 && nums[i] == nums[i-1] {
continue
}
left := i + 1
right := length - 1
for left < right {
if nums[left]+nums[right]+v1 < 0 {
left++
continue
}
if nums[left]+nums[right]+v1 > 0 {
right--
continue
}
if nums[left]+nums[right]+v1 == 0 {
tmp := []int{v1, nums[left], nums[right]}
res = append(res, tmp)
for left < right && nums[left] == nums[left+1] {
left++
}
for left < right && nums[right] == nums[right-1] {
right--
}
left++
right--
}
}
}
return res
}

浙公网安备 33010602011771号