373. 查找和最小的 K 对数字
参考的这个博客:
https://zhuanlan.zhihu.com/p/457239781
然后看这个代码我想到了另外一种方法,就是一步一步往里加元组
(
i
,
j
)
(i,j)
(i,j),看代码就知道了,不过需要做一步去重,去重不能用
i
n
t
[
]
int[]
int[]做,转换成字符串做比较好。
class Solution {
public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
List<List<Integer>> ans = new ArrayList<>();
PriorityQueue<int[]> q = new PriorityQueue<>((a,b)->((nums1[a[0]]+nums2[a[1]])-(nums1[b[0]]+nums2[b[1]])));
// for(int i=0;i<nums1.length;i++){
// q.add(new int[]{i,0});
// }
q.add(new int[]{0,0});
HashMap<String,Integer> mp = new HashMap<String,Integer>();
mp.put((Arrays.toString(new int[]{0,0})),1);
while(ans.size()<k && !q.isEmpty()){
int[] poll = q.poll();
int a = poll[0];
int b = poll[1];
ArrayList<Integer> arr = new ArrayList<Integer>();
arr.add(nums1[a]);
arr.add(nums2[b]);
ans.add(arr);
if(b+1<nums2.length && !mp.containsKey(Arrays.toString(new int[]{a,b+1})))
{
mp.put((Arrays.toString(new int[]{a,b+1})),1); q.add(new int[]{a,b+1});
}
if(a+1<nums1.length && !mp.containsKey(Arrays.toString(new int[]{a+1,b})))
{
q.add(new int[]{a+1,b}); mp.put((Arrays.toString(new int[]{a+1,b})),1);
}
if(a+1<nums1.length && b+1<nums2.length && !mp.containsKey(Arrays.toString(new int[]{a+1,b+1})))
{
q.add(new int[]{a+1,b+1});mp.put((Arrays.toString(new int[]{a+1,b+1})),1);
}
}
return ans;
}
}