Leetcode Java Find K Pairs with Smallest Sums
업데이트:
문제
코드
class Solution {
public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
List<List<Integer>> result = new ArrayList<>();
Queue<int[]> queue = new PriorityQueue<>((a, b) -> (a[0] + a[1] - b[0] - b[1]));
for (int idx = 0; idx < nums1.length && idx < k; idx++) {
queue.offer(new int[] { nums1[idx], nums2[0], 0 });
}
while (k-- > 0 && !queue.isEmpty()) {
int[] curr = queue.poll();
List<Integer> temp = new ArrayList<>();
temp.add(curr[0]);
temp.add(curr[1]);
result.add(temp);
if (curr[2] == nums2.length - 1) {
continue;
}
queue.add(new int[] { curr[0], nums2[curr[2] + 1], curr[2] + 1 });
}
return result;
}
}
결과
설명
-
주어진 배열 nums1과 nums2는 오름차순 정렬되어 있으며, 해당 값들을 이용하여 k개의 작은 부분 배열들을 만드는 문제이다.
- 문제 풀이에 필요한 변수를 정의한다.
- result는 부분 배열을 저장할 List이다.
- queue는 num1을 이용한 임의 부분 배열을 저장할 Queue로, $a[0] + a[1] - b[0] - b[1]$의 순서로 PriorityQueue를 이용하여 정의한다.
- nums1을 반복하여 k개까지 조합을 queue에 넣어준다.
- 필요한 nums1의 값과 nums2의 첫 값, 0을 차례대로 queue에 넣어준다.
- k를 감소시키며 0보다 크고 queue가 비어있지 않을 때 까지 반복하여 result에 부분 배열들을 넣어준다.
- curr에 queue의 배열을 꺼내 넣어준다.
- temp List를 새로 정의해서 curr의 앞의 두 값을 넣고 result에 넣어준다.
- curr의 세 번째 값이 $nums2.length - 1$인 경우, 반복을 계속 반복한다.
- queue에 curr의 첫 값과, nums2에서 curr의 세 번째 값에 1을 더한 값의 위치 값, curr의 세 번째 값에 1을 더한 값을 queue에 다시 넣어준다.
- 반복이 완료되면 부분 배열을 넣은 reulst를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기