• java中PriorityQueue队列的使用


    最近做力扣767. 重构字符串时用到了PriorityQueue,平时工作很少用到这个优先级队列,在此做个学习笔记

    java.util.PriorityQueue继承自java.util.AbstractQueue抽象类,java.util.AbstractQueue实现了java.util.Queue接口:

    PriorityQueue的特点:它会根据放进队列的元素的自然排序或者自定义排序把最小值或者最大值放到队列的头部,每次poll()或者peek()拿到的都是队列的最小值或者最大值。注意一点:它只保证队列头部的值是最大值或者最小值,队列里面的所有元素并不是有序的,队列其它元素的顺序都是任意的。如果要有序的遍历一个PriorityQueue,可以调用出队方法poll():

     使用示例:

    1. import java.util.Comparator;
    2. import java.util.PriorityQueue;
    3. public class Solution {
    4. public static void main(String[] args){
    5. Solution s = new Solution();
    6. Child th = s.new Child();
    7. th.studyPriorityQueue();
    8. }
    9. class Child {
    10. /**
    11. * 在力扣767. 重构字符串的基础上
    12. * 把字符串"vvvlllo"转换成相邻字符不同的字符串
    13. */
    14. public void studyPriorityQueue() {
    15. String str = "vvvlllo";
    16. int[] counts = new int[26];
    17. for (int i=0; i
    18. counts[str.charAt(i) - 'a']++;
    19. }
    20. PriorityQueue queue = new PriorityQueue<>(new Comparator() {
    21. @Override
    22. public int compare(Character c1, Character c2) {
    23. /**
    24. * 因为评论区看有个童鞋提出疑问:
    25. * 每次从队列中取出2个字符的话,题目中没有保证他们总是按照特定顺序取,比如给定的字符串是aaabbb的话?
    26. * 所以这里参考他们的想法,当字母出现次数相同时自然顺序较小的字母优先级更高
    27. */
    28. // 如果字母出现的次数一样,则按自然顺序较小字母的优先级更高
    29. // 如果字母出现的次数不一样,则出现次数更多字母优先级更高
    30. return counts[c1-'a'] == counts[c2-'a'] ? c1 - c2 : counts[c2-'a'] - counts[c1-'a'];
    31. }
    32. });
    33. // 把所有出现的字母放到队列
    34. for (char c='a'; c<='z'; c++) {
    35. if (counts[c-'a'] > 0) {
    36. queue.offer(c);
    37. }
    38. }
    39. StringBuffer sb = new StringBuffer();
    40. while (queue.size() > 1) {
    41. // 每次取队列头部的字母
    42. Character c1 = queue.poll();
    43. sb.append(c1);
    44. Character c2 = queue.poll();
    45. sb.append(c2);
    46. // 对应字母次数减1,如果减1后还大于0重新放回队列
    47. if (--counts[c1-'a'] > 0) {
    48. queue.offer(c1);
    49. }
    50. if (--counts[c2-'a'] > 0) {
    51. queue.offer(c2);
    52. }
    53. }
    54. // 如果队列非空,肯定是还剩一个字母,直接取出拼到结果里面
    55. if (!queue.isEmpty()) {
    56. sb.append(queue.poll());
    57. }
    58. System.out.println(sb);
    59. }
    60. }
    61. }

  • 相关阅读:
    Mysql8与mariadb的安装与常用设置
    5年专业研究,这份云原生安全指南请查收
    Vue3 快速入门及巩固基础
    【毕业设计】62-基于单片机的防酒驾\酒精浓度检测系统设计研究(原理图、源代码、仿真工程、低重复率参考设计、PPT)
    vue监听表单项填写完整
    C#使用Objects Comparer进行对象比较
    mac电脑做为开发机的一些初始化操作
    haskell的列表推导中的基本概念和其他列表功能head/tail/take/drop
    暑假超越计划练习题(3)
    二叉树的最大深度(C++两种思路递归和层序)超详解小白入
  • 原文地址:https://blog.csdn.net/u011998957/article/details/126228525