|
6 | 6 | import java.util.Queue;
|
7 | 7 |
|
8 | 8 | public class _373 {
|
9 |
| - public static class Solution1 { |
10 | 9 |
|
11 |
| - final int[][] neighbors = new int[][]{{0, 1}, {1, 0}}; |
12 |
| - |
13 |
| - public List<int[]> kSmallestPairs(int[] nums1, int[] nums2, int k) { |
14 |
| - List<int[]> result = new ArrayList<>(); |
15 |
| - if (nums1 == null |
16 |
| - || nums2 == null |
17 |
| - || k == 0 |
18 |
| - || nums1.length == 0 |
19 |
| - || nums2.length == 0) { |
20 |
| - return result; |
21 |
| - } |
22 |
| - Queue<Pair> meanHeap = new PriorityQueue<>(); |
23 |
| - meanHeap.offer(new Pair(0, 0, nums1[0] + nums2[0])); |
24 |
| - boolean[][] visited = new boolean[nums1.length][nums2.length]; |
25 |
| - visited[0][0] = true;//we start form (0,0), so mark it as visited |
26 |
| - while (k > 0 && !meanHeap.isEmpty()) { |
27 |
| - Pair pair = meanHeap.poll(); |
28 |
| - result.add(new int[]{nums1[pair.row], nums2[pair.col]}); |
29 |
| - k--; |
30 |
| - for (int[] neighbor : neighbors) { |
31 |
| - int nextRow = pair.row + neighbor[0]; |
32 |
| - int nextCol = pair.col + neighbor[1]; |
33 |
| - if (nextRow < 0 |
34 |
| - || nextCol < 0 |
35 |
| - || nextRow >= nums1.length |
36 |
| - || nextCol >= nums2.length |
37 |
| - || visited[nextRow][nextCol]) { |
38 |
| - continue; |
39 |
| - } |
40 |
| - visited[nextRow][nextCol] = true; |
41 |
| - meanHeap.offer(new Pair(nextRow, nextCol, nums1[nextRow] + nums2[nextCol])); |
42 |
| - } |
43 |
| - } |
44 |
| - |
45 |
| - return result; |
46 |
| - } |
47 |
| - |
48 |
| - class Pair implements Comparable<Pair> { |
49 |
| - int row; |
50 |
| - int col; |
51 |
| - int sum; |
52 |
| - |
53 |
| - public Pair(int row, int col, int sum) { |
54 |
| - this.row = row; |
55 |
| - this.col = col; |
56 |
| - this.sum = sum; |
57 |
| - } |
58 |
| - |
59 |
| - @Override |
60 |
| - public int compareTo(Pair that) { |
61 |
| - return this.sum - that.sum; |
| 10 | + public class Solution { |
| 11 | + |
| 12 | + int[][] dirs = {{0,1},{1,0},{1,1}}; |
| 13 | + public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) { |
| 14 | + |
| 15 | + List<List<Integer>> result = new ArrayList<>(); |
| 16 | + |
| 17 | + // EDGE CASE |
| 18 | + if(nums1==null || nums2==null || nums1.length==0 || nums2.length==0) return result; |
| 19 | + |
| 20 | + // visited array |
| 21 | + boolean[][] visited = new boolean[nums1.length][nums2.length]; |
| 22 | + |
| 23 | + // Min Heap |
| 24 | + PriorityQueue<int[]> pq = new PriorityQueue<>((a,b)->{ |
| 25 | + return ( a[0]+a[1] ) - ( b[0]+b[1] ) ; |
| 26 | + }); |
| 27 | + |
| 28 | + int[] temp = new int[]{nums1[0],nums2[0],0,0}; |
| 29 | + pq.add(temp); |
| 30 | + visited[0][0]= true; |
| 31 | + |
| 32 | + while(!pq.isEmpty()){ |
| 33 | + int[] arr = pq.poll(); |
| 34 | + List<Integer> ls = new ArrayList<>(); |
| 35 | + ls.add(arr[0]);ls.add(arr[1]); |
| 36 | + result.add(ls); |
| 37 | + |
| 38 | + if(result.size()==k) break; |
| 39 | + int i=arr[2],j=arr[3]; |
| 40 | + |
| 41 | + for(int[] dir : dirs){ |
| 42 | + int dx=i+dir[0],dy=j+dir[1]; |
| 43 | + if(dx<0 || dx>=nums1.length || dy<0 || dy>=nums2.length || visited[dx][dy]) continue; |
| 44 | + pq.add(new int[]{nums1[dx],nums2[dy],dx,dy}); |
| 45 | + visited[dx][dy] = true; |
62 | 46 | }
|
63 | 47 | }
|
| 48 | + return result; |
64 | 49 | }
|
| 50 | + } |
65 | 51 | }
|
0 commit comments