leetcode 剑指 Offer II 006. 排序数组中两个数字之和

115 阅读2分钟

[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多平台发布