3 回答

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
也許這是您已經(jīng)嘗試過(guò)的蠻力方法,但我認(rèn)為這是最簡(jiǎn)單的方法。
從前兩個(gè)元素的子集開始,迭代大小增加的子集,比較子集中每個(gè)元素的值與最后一個(gè)元素的值的總和。當(dāng)你在范圍內(nèi)找到一個(gè)總和時(shí),你就完成了。
這將根據(jù)“first”的定義找到范圍內(nèi)的第一對(duì)數(shù)字,即“具有最低最大索引的對(duì)”。
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 [];
}
您可以通過(guò)跳過(guò)已經(jīng)大于范圍上限的任何值來(lái)加快速度。
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 [];
}
關(guān)于“性能最高的解決方案”,除非性能引起問(wèn)題,否則我寧愿追求簡(jiǎn)單而不是優(yōu)化性能。只是我的觀點(diǎn)。

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
將每個(gè)元素添加到樹狀圖中,鍵作為元素,值作為該元素出現(xiàn)的索引列表。
在向樹形圖添加元素時(shí),檢查是否有一個(gè)子圖,其鍵范圍從X - current_element
到Y - current_element
兩者都包含。如果您有子圖,您的答案是[curr_element, A[first_index_of_submap's value_of_first_key] ]

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊
您可以使用解決 2 sum 問(wèn)題的二進(jìn)制搜索方法,并調(diào)整您的二進(jìn)制搜索功能以在一個(gè)范圍內(nèi)搜索。像這樣的東西:
$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
)
- 3 回答
- 0 關(guān)注
- 139 瀏覽
添加回答
舉報(bào)