我的解决方案是:
function printPairs($array, $sum) {
for ($i = 0; $i < count($array); $i++) {
$first = $array[$i];
for ($j = $i + 1; $j < count($array); $j++) {
$second = $array[$j];
if (($first + $second) == $sum) {
echo($first.','.$second);
}
}
}
}
此解决方案的复杂性为O(n ^ 2) 我们如何改进这一点,我们可以做些什么来改善PHP中的这一点。
答案 0 :(得分:0)
你可以像这样重写你的功能:
function printPairs($array, $sum) {
$map = [];
foreach ($array as $v) {
if (isset($map[$sum-$v])) {
echo $v . ',' . ($sum-$v) . "\n";
echo ($sum-$v) . ',' . $v . "\n";
}
$map[$v] = 1;
}
}
平均复杂度为O(N)
答案 1 :(得分:0)
回答这个问题不会让你更好地解决问题,你需要真正理解算法及其复杂性。如果您想获得解决问题的更多经验,可以查看https://codility.com/programmers/。针对各种课程发布了许多答案,但我强烈建议您在出去寻求课程/挑战的答案之前尽量自己解决。
因此,对于这个问题,您会得到一个整数数组和一个整数,您需要找到它们。
您可能还需要确保每个数字(数组中的索引)仅使用一次。
因此,如果您输入的是[3,7,3]
,则您的对只是[[3,7]]
而不是[[3,7],[7,3]]
优化解决方案
此解决方案将被视为O(2n)
或简化为O(n)
,因为它遵循线性时间。
function solution(array $arr, $int) {
$results = [];
$map = [];
# create a map of ints and how many you have
$size = sizeof($arr);
for($x = 0; $x < $size; $x++) {
$n = $arr[$x];
if (!array_key_exists($n, $map)) {
$map[$n] = 0;
}
$map[$n]++;
}
# loop through and find the pairs
$size = sizeof($map);
foreach($map as $n => $c) {
$w = $int - $n;
if (!array_key_exists($w, $map)) {
continue;
}
$map[$n]--;
$map[$w]--;
# edge case when $n === $w
if ($map[$n] < 0 || $map[$w] < 0) {
$map[$n]++;
$map[$w]++;
continue;
}
$results[] = [$n,$w];
}
return $results;
}
echo json_encode(solution([], 10)) . PHP_EOL;
echo json_encode(solution([1], 10)) . PHP_EOL;
echo json_encode(solution([10], 10)) . PHP_EOL;
echo json_encode(solution([0,10], 10)) . PHP_EOL;
echo json_encode(solution([5,5], 10)) . PHP_EOL;
echo json_encode(solution([-5,15], 10)) . PHP_EOL;
echo json_encode(solution([3,7,3], 10)) . PHP_EOL;
echo json_encode(solution([3,7,3,7,1,9], 10)) . PHP_EOL;
输出
[]
[]
[]
[[0,10]]
[[5,5]]
[[-5,15]]
[[3,7]]
[[3,7],[7,3],[1,9]]