github地址:git@github.com:ZQCard/leetcode.git
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
package problem
// 56ms // 复杂度分析: // 时间复杂度:O(n^2)O(n2), 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素, // 这将耗费 O(n)O(n) 的时间。因此时间复杂度为 O(n^2)O(n2)。 // 空间复杂度:O(1)O(1)。
func TwoSum(nums []int, target int) []int{
var res []int
for key, value := range nums {
for k, v := range nums{
if k <= key {
continue
}
if value + v == target {
res = append(res, key)
res = append(res, k)
return res
}
}
}
return res
}
// 44ms // 优化1
func TwoSum2(nums []int, target int) []int {
length := len(nums)
for i := 0; i < length; i++ {
for j := i + 1; j < length; j++ {
if nums[i] + nums[j] == target{
return []int{i, j}
}
}
}
return []int{}
}
// 8ms // 复杂度分析: // 时间复杂度:O(n)O(n), 我们把包含有 nn 个元素的列表遍历两次。 // 由于哈希表将查找时间缩短到 O(1)O(1) ,所以时间复杂度为 O(n)O(n)。 // 空间复杂度:O(n)O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 nn 个元素。
func TwoSumTwoMap(nums []int, target int) []int {
numMap := make(map[int]int)
for i := 0; i < len(nums); i++ {
numMap[i] = nums[i]
}
numMap2 := make(map[int]int)
for i := 0; i < len(nums); i++ {
numMap2[nums[i]] = i
}
for i := 0; i < len(nums); i++ {
complement := target - numMap[i]
if k, ok := numMap2[complement]; k != i && ok{
return []int{i, k}
}
}
return nil
} // 4ms func TheBest(nums []int, target int) []int { m := make(map[int]int) for i, num := range nums { t, found := m[target - num] if found { return []int{t, i} } else { m[num] = i } } return nil }