• 算法day27


    第一题

    515. 在每个树行中找最大值

            首先是遍历每层的节点,将每一层最大值的节点的值保留下来,最后将所有层的最大值的表返回;具体的遍历每层节点的过程如上一篇故事;

    综上所述,代码如下:

    1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode() {}
    8. * TreeNode(int val) { this.val = val; }
    9. * TreeNode(int val, TreeNode left, TreeNode right) {
    10. * this.val = val;
    11. * this.left = left;
    12. * this.right = right;
    13. * }
    14. * }
    15. */
    16. class Solution {
    17. public List largestValues(TreeNode root) {
    18. List ret = new ArrayList<>();
    19. if(root== null) return ret;
    20. Queue q = new LinkedList<>();
    21. q.add(root);
    22. while(!q.isEmpty()){
    23. int size = q.size();
    24. int tmp = Integer.MIN_VALUE;
    25. for(int i = 0;i
    26. TreeNode t = q.poll();
    27. tmp = Math.max(tmp,t.val);
    28. if(t.left != null)q.add(t.left);
    29. if(t.right != null) q.add(t.right);
    30. }
    31. ret.add(tmp);
    32. }
    33. return ret;
    34. }
    35. }

    第二题

    1046. 最后一块石头的重量

    实例分析:

            我们采用堆的解题方法;

            创建一个大根堆,把所有的元素放入到大根堆里面;

            每次返回堆顶的两个元素,得到两个数的差值在进入到大根堆里面;

            最后只要大根堆的里面有元素就一直重复出堆相减的操作;

            返回最后的数值即可;

    综上所述,代码如下:

    1. class Solution {
    2. public int lastStoneWeight(int[] stones) {
    3. //1、创建一个大根堆
    4. PriorityQueue heap = new PriorityQueue<>((a,b) -> b-a);
    5. //2、把所有的石头放进堆里里面
    6. for(int x :stones){
    7. heap.offer(x);
    8. }
    9. //3、模拟
    10. while(heap.size()>1){
    11. int a = heap.poll();
    12. int b = heap.poll();
    13. if(a > b ){
    14. heap.offer(a-b);
    15. }
    16. }
    17. return heap.isEmpty()?0:heap.peek();
    18. }
    19. }

    第三题

    703. 数据流中的第 K 大元素

    本题是top-k模型,解题思路如下所示:

            创建一个长度为k的小根堆,然后开始往里面加入元素,一直等加入元素后小根堆的长度大于k值时,我们进行出堆操作,即将小根堆顶部的元素退出去,在进行入堆操作,就这样一直重复操作,直到所有的元素都进行过入堆操作,这时候返回的堆顶的元素即是我们所求;

            综上所述,代码如下:

    1. class KthLargest {
    2. PriorityQueue heap;
    3. int k1;
    4. public KthLargest(int k, int[] nums) {
    5. k1 = k;
    6. heap = new PriorityQueue<>();
    7. for(int x : nums){
    8. heap.offer(x);
    9. if(heap.size() > k1){
    10. heap.poll();
    11. }
    12. }
    13. }
    14. public int add(int val) {
    15. heap.offer(val);
    16. if(heap.size() > k1){
    17. heap.poll();
    18. }
    19. return heap.peek();
    20. }
    21. }
    22. /**
    23. * Your KthLargest object will be instantiated and called as such:
    24. * KthLargest obj = new KthLargest(k, nums);
    25. * int param_1 = obj.add(val);
    26. */

    第四题

    692. 前K个高频单词

    解法:本题利用堆来解决top-k问题;

    步骤:

    步骤一:

            预处理一下原始的字符串数组,即用一个hash表统计一下每一个单词出现的频次;

    步骤二:

            创建一个大小为k的堆:

            频次不同:小根堆

            频次相同时创建大根堆(字典序)

    步骤三:

            开始循环操作:

            让元素依次进堆,判断条件,如果不满足条件的话就进行堆顶的元素出堆操作

    步骤四:

            根据实际情况对元素进行逆序操作

            综上所述,代码如下:

    1. class Solution {
    2. public List topKFrequent(String[] words, int k) {
    3. //1、统计一下每一个单词出现的次数
    4. Map hash = new HashMap<>();
    5. for(String s: words){
    6. hash.put(s,hash.getOrDefault(s,0)+1);
    7. }
    8. //2、创建一个大小为k的堆
    9. PriorityQueue> heap = new PriorityQueue<>
    10. (
    11. (a,b) -> {
    12. if(a.getValue().equals(b.getValue()))//出现频次相同的时候,字典按照大根堆的顺序排列
    13. {
    14. return b.getKey().compareTo(a.getKey());
    15. }
    16. return a.getValue() - b.getValue();
    17. }
    18. );
    19. //3、top-k的主逻辑
    20. for(Map.Entry e : hash.entrySet()){
    21. heap.offer(new Pair<>(e.getKey(),e.getValue()));
    22. if(heap.size() > k){
    23. heap.poll();
    24. }
    25. }
    26. //4、提取结果
    27. List ret = new ArrayList<>();
    28. while(!heap.isEmpty()){
    29. ret.add(heap.poll().getKey());
    30. }
    31. //逆序数组
    32. Collections.reverse(ret);
    33. return ret;
    34. }
    35. }

    ps:本次的内容就到这里了,如果对你有所帮助的话就请一键三连哦!!! 

  • 相关阅读:
    给电热水器瘦个身,让它好看更好用,云米电热水器Air2 Mini体验
    处理爬取html内容调用RestTemplate方法远程调接口会出现中文乱码问题
    linux下的权限
    【JavaScript】制作一个抽奖转盘页面
    一种让运行在CentOS下的.NET CORE的Web项目简单方便易部署的自动更新方案
    顺丰科技2024届春季校园招聘常见问题解答及SHL测评题库
    循环结构--do-while循环
    如何把A3 pdf 文章打印成A4
    Git分布式版本控制工具
    360安全卫士弹窗广告怎么彻底关闭
  • 原文地址:https://blog.csdn.net/2202_76101487/article/details/139624976