给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 ,
所以答案数组应当满足 0 <= answer[0] < answer[1] < numbers.length 。
假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。
示例 1:输入:numbers = [1,2,4,6,10], target = 8 输出:[1,3]
解释:2 与 6 之和等于目标数 8 。因此 index1 = 1, index2 = 3 。
示例 2:输入:numbers = [2,3,4], target = 6 输出:[0,2]
示例 3:输入:numbers = [-1,0], target = -1 输出:[0,1]
提示:2 <= numbers.length <= 3 * 104
-1000 <= numbers[i] <= 1000
numbers 按 递增顺序 排列
-1000 <= target <= 1000
仅存在一个有效答案
注意:本题与主站 167 题相似(下标起点不同)
1、暴力法;时间复杂度O(n^2),空间复杂度O(1)
func twoSum(numbers []int, target int) []int {
m := make(map[int]int, len(numbers))
for i, n := range numbers {
if m[target-n] != 0 {
return []int{m[target-n] - 1, i}
}
m[n] = i + 1
}
return nil
}
2、哈希;时间复杂度O(n),空间复杂度O(n)
func twoSum(nums []int, target int) []int {
m := make(map[int]int, len(nums))
for k, v := range nums {
m[v] = k
}
for i := 0; i < len(nums); i++ {
b := target - nums[i]
if num, ok := m[b]; ok && num != i {
return []int{i, m[b]}
}
}
return []int{}
}
3、哈希;时间复杂度O(n),空间复杂度O(n)
func twoSum(nums []int, target int) []int {
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 []int{}
}
4、双指针;时间复杂度O(n),空间复杂度O(1)
func twoSum(numbers []int, target int) []int {
first := 0
last := len(numbers) - 1
result := make([]int, 2)
for {
if numbers[first]+numbers[last] == target {
result[0] = first
result[1] = last
return result
} else if numbers[first]+numbers[last] > target {
last--
} else {
first++
}
}
}
Easy题目,题目同leetcode 167.两数之和 II - 输入有序数组
页面更新:2024-05-29
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号