给定一个升序的整数数组numbers,从数组中找出两个数满足: 两数之和等于目标数target,且两个数不能是同一个数, 假设每个输入只对应唯一的答案,不能重复使用同一个元素(下标不能相同)。返回两数的下标。
- 暴力破解,O(n2)
- map打标记,O(n),但是空间复杂度也为O(n)
- 二分查找(对于每一个x,找target-x是否在数组中),O(nlogn)
func solution(nums []int, target int)(int, int){
var low = 0
var high = len(nums)-1
for i:=0;i<len(nums);i++{
// low为其中的一个默认解
low = i
for low<high{
mid := (high+low)/2
if nums[mid] == target-nums[i]{
return i, mid
}else if nums[mid]>target-nums[i]{
high = mid-1
}else{
low = mid+1
}
}
}
return -1,-1
}
- 双指针(最优)
func solution2(nums []int, target int)(int, int){
var low = 0
var high = len(nums)-1
for low<high{
switch sum:=nums[low]+nums[high];{
case sum==target:
return low, high
case sum<target://小了说明low小
low++
default://大了说明high大
high--
}
}
return -1, -1
}