LeetCode——堆

接雨水

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;
    }
}

丑数

264.丑数II
313.超级丑数

其他

864.获取所有钥匙的最短路径(广度优先遍历,用三维数组代替之前的used数组)
818.赛车(动态规划/Dijkstra)
871.最低加油次数
23.合并K个排序链表(分治算法+合并有序链表)
743.网络延迟时间(Dijkstra)
295.数据流的中位数
218.天际线问题
787.K站中转内最便宜的航班
767.重构字符串
239.滑动窗口最大值
502.IPO
778.水位上升的泳池中游泳
1046.最后一块石头的重量
1054.距离相等的条形码
451.根据字符出现频率排序
973.最接近原点的K个点
355.设计推特

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值