第一题的任务是实现一个两数之和的查找;
最基本的思路是首先初始化一个空的切片数组作为答案
然后依次遍历每个数,当它之后的某个数和它的和是target时就返回他们的下标。
func twoSum(nums []int, target int) []int {
res:=[]int{}
i:=0
for i<len(nums)-1{
j:=i+1
for j<len(nums) {
if nums[i]+nums[j]==target{
res=append(res,i,j)
}
j++
}
i++
}
return res
}
题目也暗示了存在优于O(n^2)的解法,考虑到这里面几乎每个数都被比较了n次,完全可以先把下标和值取出来
即 如果我找到了val,那么去map查是否有target-val存在。存在就说明结果找到了
没存在就说明我找到了一个新的值,把这个值的下标和数加入map
这里需要注意go的一个特殊语法点:
;用来分割if里面两个连续的执行(由于go里通常用换行代表,其实很少看到;)
dex,ok:=m[target-val];
if ok{
}
和下文中对应的部分,是完全等价的
func twoSum(nums []int, target int) []int {
res:=[]int{}
m:=make(map[int]int)
for index,val:=range nums{
if dex,ok:=m[target-val];ok {
return []int{index,dex}
}else{
m[val]=index;
}
}
return res
}
网友评论