feat(15-3sum): add golang solution
This commit is contained in:
parent
63397e07cd
commit
3fed6cd2f9
20
015_3sum/README.md
Normal file
20
015_3sum/README.md
Normal file
@ -0,0 +1,20 @@
|
||||
Given an integer array nums, return all the triplets `[nums[i], nums[j], nums[k]]` such that `i != j`, `i != k`, and `j != k`, and `nums[i] + nums[j] + nums[k] == 0`.
|
||||
|
||||
Notice that the solution set must not contain duplicate triplets.
|
||||
|
||||
Example 1:
|
||||
|
||||
Input: nums = [-1,0,1,2,-1,-4] Output: [[-1,-1,2],[-1,0,1]]
|
||||
|
||||
Example 2:
|
||||
|
||||
Input: nums = [] Output: []
|
||||
|
||||
Example 3:
|
||||
|
||||
Input: nums = [0] Output: []
|
||||
|
||||
Constraints:
|
||||
|
||||
* `0 <= nums.length <= 3000`
|
||||
* `-105 <= nums[i] <= 105`
|
49
015_3sum/golang/solution.go
Normal file
49
015_3sum/golang/solution.go
Normal file
@ -0,0 +1,49 @@
|
||||
func threeSum(nums []int) (result [][]int) {
|
||||
target := 0
|
||||
sort.Ints(nums)
|
||||
|
||||
for i := 0; i < len(nums)-2; i++ {
|
||||
// We don't want duplicates of the fixed value
|
||||
// which can cause duplicate triplets to appear.
|
||||
if i > 0 && nums[i] == nums[i-1] {
|
||||
continue
|
||||
}
|
||||
|
||||
startPtr := i + 1
|
||||
endPtr := len(nums) - 1
|
||||
|
||||
for startPtr < endPtr {
|
||||
sum := nums[i] + nums[startPtr] + nums[endPtr]
|
||||
|
||||
if sum == target {
|
||||
result = append(
|
||||
result,
|
||||
[]int{nums[i], nums[startPtr], nums[endPtr]},
|
||||
)
|
||||
|
||||
// Duplicate values can appear while scanning also. Presence of these
|
||||
// duplicate values can also result in duplicate triplets. So, for the
|
||||
// start and end pointers, we need to keep moving them until we are
|
||||
// clear of duplicates.
|
||||
for startPtr < endPtr && nums[startPtr] == nums[startPtr+1] {
|
||||
startPtr++
|
||||
}
|
||||
|
||||
for endPtr > startPtr && nums[endPtr] == nums[endPtr-1] {
|
||||
endPtr--
|
||||
}
|
||||
|
||||
// Since the loops above stop at the last duplicate value, we need to move
|
||||
// them by one step from both directions to continue with the logic.
|
||||
startPtr++
|
||||
endPtr--
|
||||
} else if sum < target {
|
||||
startPtr++
|
||||
} else {
|
||||
endPtr--
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
Loading…
Reference in New Issue
Block a user