JZ42 和为S的两个数字

和为S的两个数字

题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

要找到和为 S 的两个数字,可以使用双指针的方法。假设给定的升序数组为 numbers,我们可以使用两个指针,一个指向数组的起始位置,另一个指向数组的结束位置。

算法步骤如下:

  1. 初始化两个指针,一个指向数组的起始位置,即 0,另一个指向数组的结束位置,即 len(numbers)-1。
  2. 计算当前指针指向的两个数字的和,即 numbers[start] + numbers[end]。
  3. 如果和等于目标和 S,则返回这两个数字。
  4. 如果和小于目标和 S,则将起始位置的指针向右移动一位,以增加和的值。
  5. 如果和大于目标和 S,则将结束位置的指针向左移动一位,以减小和的值。
  6. 重复步骤 2 到步骤 5,直到找到和为 S 的两个数字,或者起始位置的指针超过结束位置的指针为止。
  7. 如果没有找到符合条件的两个数字,则返回一个空结果。
func FindNumbersWithSum( array []int ,  sum int ) []int {
    // write code here
    if len(array) < 2 {
        return nil
    }

    start, end := 0, len(array) - 1

    for start < end  {
        total :=  array[start] + array[end]
        if total == sum {
            return []int{array[start], array[end]}
        } else if total < sum {
            start++
        } else {
            end--
        }
    }

    if array[start] + array[end] == sum {
        return []int{array[start], array[end]}
    }

    return nil
}

  

posted @ 2021-04-10 17:04  zqlucky  阅读(42)  评论(0编辑  收藏  举报