diff --git a/README.md b/README.md index f972518aa..9e6d7e340 100644 --- a/README.md +++ b/README.md @@ -1698,7 +1698,7 @@ implementation 'com.github.javadev:leetcode-in-java:1.41' |-|-|-|-|-|- | 0215 |[Kth Largest Element in an Array](src/main/java/g0201_0300/s0215_kth_largest_element_in_an_array/Solution.java)| Medium | Top_100_Liked_Questions, Top_Interview_Questions, Array, Sorting, Heap_Priority_Queue, Divide_and_Conquer, Quickselect, Big_O_Time_O(n\*log(n))_Space_O(log(n)) | 5 | 70.82 | 0502 |[IPO](src/main/java/g0501_0600/s0502_ipo/Solution.java)| Hard | Array, Sorting, Greedy, Heap_Priority_Queue | 64 | 97.22 -| 0373 |[Find K Pairs with Smallest Sums](src/main/java/g0301_0400/s0373_find_k_pairs_with_smallest_sums/Solution.java)| Medium | Array, Heap_Priority_Queue | 0 | 100.00 +| 0373 |[Find K Pairs with Smallest Sums](src/main/java/g0301_0400/s0373_find_k_pairs_with_smallest_sums/Solution.java)| Medium | Array, Heap_Priority_Queue | 27 | 90.23 | 0295 |[Find Median from Data Stream](src/main/java/g0201_0300/s0295_find_median_from_data_stream/MedianFinder.java)| Hard | Top_100_Liked_Questions, Sorting, Two_Pointers, Design, Heap_Priority_Queue, Data_Stream, Big_O_Time_O(n\*log_n)_Space_O(n) | 83 | 99.56 #### Top Interview 150 Bit Manipulation diff --git a/src/main/java/g0301_0400/s0373_find_k_pairs_with_smallest_sums/Solution.java b/src/main/java/g0301_0400/s0373_find_k_pairs_with_smallest_sums/Solution.java index 0aac8fa26..9ce0018fa 100644 --- a/src/main/java/g0301_0400/s0373_find_k_pairs_with_smallest_sums/Solution.java +++ b/src/main/java/g0301_0400/s0373_find_k_pairs_with_smallest_sums/Solution.java @@ -1,104 +1,42 @@ package g0301_0400.s0373_find_k_pairs_with_smallest_sums; // #Medium #Array #Heap_Priority_Queue #Top_Interview_150_Heap -// #2025_03_09_Time_0_ms_(100.00%)_Space_57.66_MB_(90.88%) +// #2025_03_09_Time_27_ms_(90.23%)_Space_58.22_MB_(77.32%) -import java.util.AbstractList; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import java.util.PriorityQueue; public class Solution { - public List> kSmallestPairs(int[] nums1, int[] nums2, int k) { - return new AbstractList>() { - private List> pairs; - - @Override - public List get(int index) { - init(); - return pairs.get(index); - } - - @Override - public int size() { - init(); - return pairs.size(); - } - - private void load() { - int n = nums1.length; - int m = nums2.length; - int left = nums1[0] + nums2[0]; - int right = nums1[n - 1] + nums2[m - 1]; - int middle; - - while (left <= right) { - middle = (left + right) / 2; - long count = getCount(nums1, nums2, middle, k); - if (count < k) { - left = middle + 1; - } else if (count > k) { - right = middle - 1; - } else { - left = middle; - break; - } - } - getPairs(nums1, nums2, left, k); - } - - private long getCount(int[] nums1, int[] nums2, int goal, int k) { - int prevRight = nums2.length - 1; - int count = 0; - - for (int i = 0; i < nums1.length && nums1[i] + nums2[0] <= goal; i++) { - int left = 0; - int right = prevRight; - int position = -1; - while (left <= right) { - int middle = (right + left) / 2; - int sum = nums1[i] + nums2[middle]; - if (sum <= goal) { - position = middle; - left = middle + 1; - } else { - right = middle - 1; - } - } - if (position >= 0) { - count += position + 1; - prevRight = position; - } - if (count > k) { - return count; - } - } - return count; - } - - private void getPairs(int[] nums1, int[] nums2, int sum, int k) { - pairs = new ArrayList<>(); - for (int item : nums1) { - for (int j = 0; j < nums2.length && item + nums2[j] < sum; j++) { - pairs.add(Arrays.asList(item, nums2[j])); - } - } - for (int value : nums1) { - for (int j = 0; - j < nums2.length && value + nums2[j] <= sum && pairs.size() < k; - j++) { - if (value + nums2[j] == sum) { - pairs.add(Arrays.asList(value, nums2[j])); - } - } - } - } + private static class Node { + long sum; + List al; + int index; + + Node(int index, int num1, int num2) { + this.sum = (long) num1 + (long) num2; + this.al = new ArrayList<>(); + this.al.add(num1); + this.al.add(num2); + this.index = index; + } + } - public void init() { - if (null == pairs) { - load(); - } + public List> kSmallestPairs(int[] nums1, int[] nums2, int k) { + PriorityQueue queue = new PriorityQueue<>((a, b) -> a.sum < b.sum ? -1 : 1); + List> res = new ArrayList<>(); + for (int i = 0; i < nums1.length && i < k; i++) { + queue.add(new Node(0, nums1[i], nums2[0])); + } + for (int i = 1; i <= k && !queue.isEmpty(); i++) { + Node cur = queue.poll(); + res.add(cur.al); + int next = cur.index; + int lastNum1 = cur.al.get(0); + if (next + 1 < nums2.length) { + queue.add(new Node(next + 1, lastNum1, nums2[next + 1])); } - }; + } + return res; } }