栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【剑指 Offer(专项突击版)】057、059刷题笔记【滑动窗口+红黑树】【优先队列】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【剑指 Offer(专项突击版)】057、059刷题笔记【滑动窗口+红黑树】【优先队列】

文章目录

[057 - 剑指 Offer II 057. 值和下标之差都在给定的范围内【滑动窗口+红黑树】](https://leetcode-cn.com/problems/7WqeDu/)[059 - 剑指 Offer II 059. 数据流的第 K 大数值【优先队列】](https://leetcode-cn.com/problems/jBjn9C/)


057 - 剑指 Offer II 057. 值和下标之差都在给定的范围内【滑动窗口+红黑树】

用红黑树维护一个大小为k的滑动窗口。

对于每一个元素nums[i],从窗口[max(i-k,0), i)中找到最接近nums[i]的数,这个数可能是

小于等于nums[i]的最大值left ;或大于等于nums[i]的最小值right。

如果存在这样的left或者right使得其与nums[i]的差小于等于t,即返回true。

class Solution {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        int n = nums.length;
        TreeSet treeSet = new TreeSet<>();

        for (int i = 0; i < n; i++) {
            Long num = nums[i] * 1L;
            // 小于等于num的最大值
            Long left = treeSet.floor(num);
            // 大于等于num的最小值
            Long right = treeSet.ceiling(num);
            if (left != null && num - left <= t)
                return true;
            if (right != null && right - num <= t)
                return true;
            treeSet.add(num);
            if (i >= k) 
                treeSet.remove(nums[i - k] * 1L);
        }

        return false;
    }
}
059 - 剑指 Offer II 059. 数据流的第 K 大数值【优先队列】

用一个大小为k的优先队列来存储前k大的元素,其中优先队列的队头为队列中最小的元素。

初始化:将初始元素插入到优先队列中。插入:插入元素后,如果队列的大小大于k,则将队头元素(最小的)弹出。最后返回队头元素(第k大元素)。

class KthLargest {
    private PriorityQueue pq;
    int k;

    public KthLargest(int k, int[] nums) {
        this.k = k;
        pq = new PriorityQueue<>();
        for (int num : nums) {
            add(num);
        }
    }

    public int add(int val) {
        pq.offer(val);
        if (pq.size() > k) {
            pq.poll(); // 弹出最小的
        }
        return pq.peek(); // 第K大
    }
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/756649.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号