接雨水
42.接雨水(Stack)
407.接雨水II(PriorityQueue)
Kth问题
703.数据流中的第K大元素
378.有序矩阵中第K小的元素
215.数组中的第K个最大元素
692.前K个高频单词
347.前K个高频元素
给定两个有序数组arr1和arr2,再给定一个整数k,返回来自arr1和arr2的两个数相加和最大的前k个,两个数必须分别来自两个数组。时间复杂度: O(klogk); 辅助空间复杂度: O(k)
public class Solution {
public class Node {
public int index1;
public int index2;
public int value;
public Node(int i1, int i2, int sum) {
index1 = i1;
index2 = i2;
value = sum;
}
}
// 大顶堆比较器
public class MaxHeapComp implements Comparator<Node> {
@Override
public int compare(Node o1, Node o2) {
return o2.value - o1.value;
}
}
public int[] topKSum(int[] arr1, int[] arr2, int topK) {
if (arr1 == null || arr2 == null || topK < 1) {
return null;
}
topK = Math.min(topK, arr1.length * arr2.length);
int[] res = new int[topK];
int resIndex = 0;
PriorityQueue<Node> maxHeap = new PriorityQueue<>(new MaxHeapComp());
HashSet<String> positionSet = new HashSet<String>();
int i1 = arr1.length - 1;
int i2 = arr2.length - 1;
maxHeap.add(new Node(i1, i2, arr1[i1] + arr2[i2]));
positionSet.add(String.valueOf(i1 + "_" + i2));
while (resIndex != topK) {
// 弹出堆顶
Node curNode = maxHeap.poll();
res[resIndex++] = curNode.value;
i1 = curNode.index1;
i2 = curNode.index2;
if (!positionSet.contains(String.valueOf(i1 - 1 + "_" + i2))) {
positionSet.add(String.valueOf(i1 - 1, i2, arr1[i1 - 1] + arr2[i2]));
maxHeap.add(new Node(i1 - 1, i2, arr1[i1 - 1] + arr2[i2]));
}
if (!positionSet.contains(String.valueOf(i1 + "_" + i2 - 1))) {
positionSet.add(String.valueOf(i1 + "_" + i2 - 1));
maxHeap.add(new Node(i1 , i2 - 1, arr1[i1] + arr2[i2 -1]));
}
}
return res;
}
}
丑数
其他
864.获取所有钥匙的最短路径(广度优先遍历,用三维数组代替之前的used数组)
818.赛车(动态规划/Dijkstra)
871.最低加油次数
23.合并K个排序链表(分治算法+合并有序链表)
743.网络延迟时间(Dijkstra)
295.数据流的中位数
218.天际线问题
787.K站中转内最便宜的航班
767.重构字符串
239.滑动窗口最大值
502.IPO
778.水位上升的泳池中游泳
1046.最后一块石头的重量
1054.距离相等的条形码
451.根据字符出现频率排序
973.最接近原点的K个点
355.设计推特