code:
type KeyValue struct {
Key int
Value int
}
type ArrKV []KeyValue
func (kvs ArrKV) Len() int {
return len(kvs)
}
func (kvs ArrKV) Less(i, j int) bool {
return kvs[i].Value < kvs[j].Value
}
func (kvs ArrKV) Swap(i, j int) {
kvs[i], kvs[j] = kvs[j], kvs[i]
}
func twoSum(nums []int, target int) []int {
nlen := len(nums)
if nlen < 2 {
return nil
}
var kvs ArrKV
for key, value := range nums[:] {
kvs = append(kvs, KeyValue{key, value})
}
sort.Sort(kvs)
if kvs[0].Value + kvs[1].Value > target || kvs[nlen-1].Value + kvs[nlen-2].Value < target{
return nil
}
nDiff := target - kvs[0].Value
startPos := 0
kvsTemp := kvs[1:nlen]
endPos := sort.Search(nlen - 1, func(i int) bool {return kvsTemp[i].Value >= nDiff})
if endPos != nlen - 1 {
endPos++
}
//fmt.Printf("endPos:%d, kvsTemp:%v, kvs:%v\n", endPos, kvsTemp, kvs)
//return nil
var anRet []int
for startPos < endPos {
if kvs[startPos].Value + kvs[endPos].Value > target {
endPos--
} else if kvs[startPos].Value + kvs[endPos].Value < target {
startPos++
} else {
anRet = append(anRet, kvs[startPos].Key, kvs[endPos].Key)
startPos++
endPos--
}
}//for startPos < endPos
return anRet
}
result: