和为s的两个数字

未匹配的标注

题目描述

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

分析

定义两个指针,分别指向数组的头和尾,两个指针都往中间移动。
移动过程中:

  • 如果两个指针指向的元素和大于 target,则右指针往左移一位。
  • 如果两个指针指向的元素和小于 target,则左指针往右移一位。
  • 如果两个指针指向的元素和等于 target,则判断其乘积是否小于结果数组,如果是则放入结果数组。

代码

<?php

namespace app\index\controller;

class Test
{

    /**
     * 输入数据
     */
    public function test()
    {
        $array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
        $sum   = 21;
        $res   = $this->FindNumbersWithSum($array, $sum);
        print_r($res);
    }

    /**
     * @title 查找满足条件的两个数
     * @param $array 升序数组
     * @param $sum   两数之和
     * @return array
     */
    function FindNumbersWithSum($array, $sum)
    {
        $l   = 0;                  // 左指针
        $r   = count($array) - 1;  // 右指针
        $res = [];                 // 结果数组

        // 当左右指针不相遇时循环
        while ($l < $r) {
            if ($array[$l] + $array[$r] < $sum) $l++;      // 如果两数之和小于 target
            elseif ($array[$l] + $array[$r] > $sum) $r--;  // 如果两数之和大于 target
            else {
                // 第一次和等于 target 的两数直接放入结果数组
                // 而新的和等于 target,则判断其积是否更小
                if (array_product([$array[$l], $array[$r]]) < array_product($res) || empty($res)) {
                    $res = [$array[$l], $array[$r]];
                }
                $l++;
                $r--;
            }
        }
        return $res;
    }
}

笔记

array_product($array):计算数组元素的乘积。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~