Сложность: medium
Вам даны два целочисленных массива nums1 и nums2, отсортированных в неубывающем порядке, и целое число k.
Определим пару (u, v), которая состоит из одного элемента из первого массива и одного элемента из второго массива.
Верните k пар (u1, v1), (u2, v2), ..., (uk, vk) с наименьшими суммами.
Пример:
Input: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
Output: [[1,2],[1,4],[1,6]]
Explanation: The first 3 pairs are returned from the sequence: [1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]
👨💻 Алгоритм:
1⃣Создайте две целочисленные переменные m и n, инициализируйте их размерами массивов nums1 и nums2 соответственно. Создайте список ans для хранения пар с наименьшими суммами, которые будут возвращены в качестве ответа. Создайте множество visited для отслеживания просмотренных пар.
2⃣Инициализируйте минимальную кучу minHeap, которая содержит тройки целых чисел: сумму пары, индекс первого элемента пары в nums1 и индекс второго элемента пары в nums2. Вставьте в minHeap первую пару из обоих массивов, т.е. nums1[0] + nums2[0], 0, 0, и добавьте пару (0, 0) в visited.
3⃣Повторяйте до получения k пар и пока minHeap не пуст:
Извлеките верхний элемент из minHeap и установите i = top[1] и j = top[2].
Добавьте пару (nums1[i], nums2[j]) в ans.
Если i + 1 < m и пары (i + 1, j) нет в visited, добавьте новую пару nums1[i + 1] + nums2[j], i + 1, j в minHeap.
Если j + 1 < n и пары (i, j + 1) нет в visited, добавьте новую пару nums1[i] + nums2[j + 1], i, j + 1 в minHeap.
Верните ans.
😎 Решение:
class Solution {
function kSmallestPairs($nums1, $nums2, $k) {
$m = count($nums1);
$n = count($nums2);
$ans = [];
$visited = [];
$minHeap = new SplPriorityQueue();
$minHeap->setExtractFlags(SplPriorityQueue::EXTR_BOTH);
$minHeap->insert([0, 0], -($nums1[0] + $nums2[0]));
$visited["0,0"] = true;
while ($k > 0 && !$minHeap->isEmpty()) {
$top = $minHeap->extract();
list($i, $j) = $top['data'];
$ans[] = [$nums1[$i], $nums2[$j]];
if ($i + 1 < $m && !isset($visited[($i + 1) . ",$j"])) {
$minHeap->insert([$i + 1, $j], -($nums1[$i + 1] + $nums2[$j]));
$visited[($i + 1) . ",$j"] = true;
}
if ($j + 1 < $n && !isset($visited["$i," . ($j + 1)])) {
$minHeap->insert([$i, $j + 1], -($nums1[$i] + $nums2[$j + 1]));
$visited["$i," . ($j + 1)] = true;
}
$k--;
}
return $ans;
}
}Ставь 👍 и забирай 📚 Базу знаний