[toc] leetcode 剑指 Offer II 006. 排序数组中两个数字之和.
题目描述
剑指 Offer II 006. 排序数组中两个数字之和
给定一个已按照 升序排列 的整数数组 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 仅存在一个有效答案
解题思路
法1
双指针+二分法
我们将一个指针left指向数组的开头,另一个指针right指向数组的末尾。然后,我们计算这两个指针所指向的元素的和sum,与目标数target进行比较。
如果sum等于target,则说明我们找到了满足条件的两个数,我们返回它们的下标值。
如果sum小于target,则说明当前的和太小了,我们需要增大和,所以将left指针向右移动一位,以便选择更大的数。
如果sum大于target,则说明当前的和太大了,我们需要减小和,所以将right指针向左移动一位,以便选择更小的数。
我们不断地根据当前的和与目标数的大小关系来调整指针的位置,直到找到满足条件的两个数或者指针交叉(即left大于等于right)。如果指针交叉了仍然没有找到满足条件的两个数,则说明数组中不存在符合条件的数字,我们返回nil。
- 时间复杂度(O(n))
- 空间复杂度(O(1))
执行结果
法1
func twoSum(numbers []int, target int) []int {
left := 0
right := len(numbers) - 1
for left < right {
sum := numbers[left] + numbers[right]
if sum == target {
return []int{left, right}
} else if sum < target {
left++
} else {
right--
}
}
return nil
}
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 0 ms , 在所有 Go 提交中击败了 100.00% 的用户 内存消耗: 2.8 MB , 在所有 Go 提交中击败了 69.36% 的用户 通过测试用例: 19 / 19 炫耀一下:
本文由mdnice多平台发布