1/100-两数之和
问题描述
解法一:暴力搜索
暴力搜索是最简单的方法(笔者觉得从暴力搜索不断优化的过程是一个有趣的过程)
时间复杂度:O(N^2)
空间复杂度:O(1)
func twoSum(nums []int, target int) []int {
// loop:
// 选择第一个数字
// 遍历后面的数字:
// if 两个数字的和==target,then 输出结果
// 继续选择下一个数字
for i := 0; i < len(nums); i++ {
for j := i + 1; j < len(nums); j++ {
if nums[i] + nums[j] == target {
return []int{i, j}
}
}
}
return nil
}
解法二:哈希查找优化解法一
通过解法一,可以看见在第二个loop中间使用线性搜索查找另一个值,因此考虑使用哈希查找优化
时间复杂度:O(N)
空间复杂度:O(N)
func twoSum(nums []int, target int) []int {
// 1.初始化一个空哈希表ht
// 2.for each i,v of nums:
// if target - v 在ht中
// 输出[]int{i, ht[target- v]}
// else
// ht中增加{v, i}
valueToIdx := make(map[int]int)
for i, v := range nums {
// 查找对应的另一个数值受否存在
if orgIdx, ok := valueToIdx[target - v]; ok {
return []int{orgIdx, i}
} else {
valueToIdx[v] = i
}
}
return nil
}
反思
找出问题的本质-查找,就会很容易求解
有疑问加站长微信联系(非本文作者)