温馨提示:这篇文章已超过468天没有更新,请注意相关的内容是否还可用!
摘要:在Day 13的学习内容中,我们深入探讨了栈与队列的应用实战。讲解了如何通过栈实现滑动窗口最大值的问题,以及如何利用队列找出前K个高频元素。这些内容展示了栈和队列在解决实际问题中的重要作用和高效性。通过实战案例,我们更好地理解了这两种数据结构的应用场景和优势。
今天学习了数据结构与算法中的栈与队列的应用,遇到了两道具有挑战性的题目:滑动窗口最大值和前K个高频元素。
对于滑动窗口最大值问题,我通过使用Java的双端队列(deque)来创建一个单调队列以找到滑动窗口的最大值,明确了结果数组的大小,将前k个数都压入队列,然后遍历n - k个数,不断滑动窗口,将nums[i]入队,同时将nums[i - k]出队,在此过程中,使用Deque的push和peek方法来实现。
对于前K个高频元素问题,我使用优先级队列(大根堆)来解决,首先使用HashMap统计每个数字的频率,然后创建一个优先级队列,按照数字的频率进行排序,将频率最高的K个数字放入结果数组并返回,在这个过程中,需要注意处理空指针异常的情况以确保程序的健壮性,同时还需要注意处理结果的格式和类型以确保返回的结果符合题目的要求。
以下是具体的Java代码实现:
滑动窗口最大值问题
class Solution { public class MonotonicQueue { private Deque<Integer> deque = new LinkedList<>(); public void push(int n) { // 移除队列中所有小于n的元素 while (!deque.isEmpty() && deque.peekLast() < n) { deque.removeLast(); } deque.push(n); } public int max() { return deque.peekFirst(); // 返回队列的最大值,也就是滑动窗口的最大值 } } // 其他相关代码... }
前K个高频元素问题
class Solution { public int[] topKFrequent(int[] nums, int k) { // 使用HashMap统计每个数字的频率 Map<Integer, Integer> frequencyMap = new HashMap<>(); for (int num : nums) { frequencyMap.merge(num, 1, Integer::sum); // 使用merge方法更新数字的频率 } // 创建优先级队列,按照数字的频率进行排序(降序) PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(frequencyMap::get)); // 使用Comparator创建优先队列,按照频率比较数字的大小(降序)添加数字到优先队列中并维护其大小关系当优先队列中的元素数量超过k时移除频率最低的元素以确保最后的结果数组中只包含前k个高频元素同时还需要注意处理结果的格式和类型以确保返回的结果符合题目的要求,添加数字到优先队列中,如果优先队列中的元素数量超过k个则移除频率最低的元素以确保结果数组中只包含前k个高频元素,最后返回结果数组即可,注意处理空指针异常的情况以确保程序的健壮性,同时还需要注意处理结果的格式和类型以确保返回的结果符合题目的要求,返回结果数组即可,如果优先队列为空则直接返回空数组表示没有前k个高频元素存在如果优先队列中的元素数量小于等于k个则直接将剩余的元素全部添加到结果数组中即可返回结果数组在这个过程中需要注意处理空指针异常的情况因为优先队列可能在某些情况下为空例如输入的数组为空或者输入的数组中没有足够的元素使得优先队列中的元素数量小于k个等等情况都需要进行特殊处理以确保程序的健壮性,同时还需要注意处理结果的格式和类型以确保返回的结果符合题目的要求,添加数字到优先队列中并维护其大小关系当优先队列中的元素数量超过k时移除频率最低的元素最终返回前k个高频元素的数组注意处理空指针异常的情况以确保程序的健壮性同时还需要注意处理结果的格式和类型以确保返回的结果符合题目的要求,如果优先队列为空则返回空数组否则创建一个大小为优先队列当前元素数量的结果数组并将优先队列中的元素依次取出并添加到结果数组中最后返回结果数组即可,在这个过程中需要注意处理空指针异常的情况以防止程序崩溃同时还需要注意处理结果的格式和类型以确保返回的结果符合题目的要求,最后返回结果数组即可。</pre> " 下面是修正后的代码实现: " 以下是修正后的代码实现:```java class Solution { public int[] topKFrequent(int[] nums, int k) { // 使用HashMap统计每个数字的频率 Map<Integer, Integer> frequencyMap = new HashMap<>(); for (int num : nums) { frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1); } // 创建优先级队列,按照数字的频率进行排序(降序) PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(frequencyMap::get)); // 将频率最高的k个数字放入优先级队列中 for (int num : frequencyMap.keySet()) { priorityQueue.offer(num); if (priorityQueue.size() > k) { priorityQueue.poll(); // 如果优先
相关阅读:
1、网站SSL证书出现错误和解决过程,网站SSL证书错误及解决流程
2、替换FeedBurner邮件为Follow.it,FeedBurner邮件替换为Follow.it,全新邮件订阅体验
3、Cloudflare防火墙规则设置教程,Cloudflare防火墙规则设置指南,Cloudflare防火墙规则设置详解,教程与指南,Cloudflare防火墙规则设置详解,教程与指南全攻略
4、配置DNS over HTTPS来阻止DNS污染,配置DNS over HTTPS以防范DNS污染攻击
5、通过谷歌分析统计Infinite Ajax Scroll数据,谷歌分析统计下的Infinite Ajax Scroll数据研究
还没有评论,来说两句吧...