feat(1-two-sum): add golang two stop soln
This commit is contained in:
commit
97c77d5641
65
0001_two-sum/golang/two-sum-two-stop-approach.go
Normal file
65
0001_two-sum/golang/two-sum-two-stop-approach.go
Normal file
@ -0,0 +1,65 @@
|
||||
import "sort"
|
||||
|
||||
type customSort struct {
|
||||
nums []int
|
||||
indices []int
|
||||
}
|
||||
|
||||
func (c customSort) Len() int {
|
||||
return len(c.nums)
|
||||
}
|
||||
|
||||
func (c customSort) Swap(i, j int) {
|
||||
c.indices[i], c.indices[j] = c.indices[j], c.indices[i]
|
||||
}
|
||||
|
||||
func (c customSort) Less(i, j int) bool {
|
||||
oi := c.indices[i]
|
||||
oj := c.indices[j]
|
||||
|
||||
return c.nums[oi] < c.nums[oj]
|
||||
}
|
||||
|
||||
func twoSum(nums []int, target int) []int {
|
||||
// Alternate solution: using two stops
|
||||
// Make a slice containing indices to the original array
|
||||
si := make([]int, len(nums))
|
||||
|
||||
for i, _ := range nums {
|
||||
si[i] = i
|
||||
}
|
||||
|
||||
// Sort the slice of indices in ascending order. This hackery
|
||||
// is needed because that's how Go's custom sorting is implemented
|
||||
sort.Sort(customSort{
|
||||
nums: nums,
|
||||
indices: si,
|
||||
})
|
||||
|
||||
lc := 0
|
||||
rc := len(si) - 1
|
||||
|
||||
for lc < rc {
|
||||
// Remember: si[lc] gives me the "index to original slice",
|
||||
// which I can then use to get the left stop's value. Similarly
|
||||
// get the right stop value.
|
||||
l := nums[si[lc]]
|
||||
r := nums[si[rc]]
|
||||
|
||||
if l+r == target {
|
||||
return []int{si[lc], si[rc]}
|
||||
}
|
||||
|
||||
// Remember: if this is less, then we need to "increase the value" of
|
||||
// l + r. Since we are traversing in the sorted array, this can only
|
||||
// mean one thing — we increase the left stop
|
||||
if l+r < target {
|
||||
lc++
|
||||
} else {
|
||||
rc--
|
||||
}
|
||||
}
|
||||
|
||||
// If we reach here, basically we didn't find the target
|
||||
return []int{}
|
||||
}
|
Loading…
Reference in New Issue
Block a user