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 }