拉风的咖菲猫
也许这是您已经尝试过的蛮力方法,但我认为这是最简单的方法。从前两个元素的子集开始,迭代大小增加的子集,比较子集中每个元素的值与最后一个元素的值的总和。当你在范围内找到一个总和时,你就完成了。这将根据“first”的定义找到范围内的第一对数字,即“具有最低最大索引的对”。function findFirstSumInRange(int $min, int $max, array $values = []): array{ for ($b = 1, $n = count($values); $b < $n; $b++) { for ($a = 0; $a < $b; $a++) { if ($min <= ($sum = $values[$a] + $values[$b]) && $sum <= $max) { return [$values[$a], $values[$b]]; // or return [$a => $values[$a], $b => $values[$b]]; if you need the keys as well } } } return [];}您可以通过跳过已经大于范围上限的任何值来加快速度。function findFirstSumInRangeB(int $min, int $max, array $values = []): array{ for ($b = 1, $n = count($values); $b < $n; $b++) { if ($values[$b] < $max) { // else these sums will all be > the range because one addend is for ($a = 0; $a < $b; $a++) { if ($values[$a] < $max && $min <= ($sum = $values[$a] + $values[$b]) && $sum <= $max) { return [$a => $values[$a], $b => $values[$b]]; } } } } return [];}关于“性能最高的解决方案”,除非性能引起问题,否则我宁愿追求简单而不是优化性能。只是我的观点。
红颜莎娜
您可以使用解决 2 sum 问题的二进制搜索方法,并调整您的二进制搜索功能以在一个范围内搜索。像这样的东西:$arr = [1,2,4,6,8,14,15,17];print_r(first_sum_in_range($arr, 25, 40));function first_sum_in_range($array, $min, $max){ foreach ($array as $k=>$a) { $b = binary_search_range($array, $a, $min, $max); if ($b !== false) { return [$a,$b]; } }}function binary_search_range($array, $a, $min, $max) { $top = sizeof($array) -1; $bot = 0; while($top >= $bot) { $p = floor(($top + $bot) / 2); if ($a+$array[$p] < $min) $bot = $p + 1; elseif ($a+$array[$p] > $max) $top = $p - 1; else return $array[$p]; } return false;}输出:Array( [0] => 8 [1] => 17)